otgs/unit-tests-framework

用于构建OTGS产品单元测试的框架


README

  • 在您的项目中创建一个 tests 目录
  • tests 目录下创建一个 phpunit 子目录1
  • samples/phpunit.xml 文件复制到您的项目的根目录2
    • test-suite-name 修改为适当的名称
    • 您可能不需要修改该文件中的其他任何内容
  • samples/bootstrap.php 文件复制到 tests/phpunit
    • 阅读此文件中的注释并做出相应的修改
  • 运行 composer require --dev otgs/unit-tests-framework3
  • tests/phpunit 下创建另一个 tests 子目录
    • 在这里编写您的测试
    • 除非您自定义了 phpunit.xml 文件,否则您不需要以任何特定的方式命名测试文件和类
  • 从项目的根目录运行 phpunit 以开始测试4

如何使用 OTGS_TestCase 类

为了充分利用这个库,您所有的测试类都应该扩展 OTGS_TestCase

一旦这样做,就会发生以下情况

  1. \OTGS_TestCase::setupBeforeClass:
  • $_GET$_POST 被设置为空数组
  • 提供 FactoryMuffin 的一个实例:您可以将其引用为 self::$fm(有关更多详细信息,请参阅“资源和依赖项”)
  1. \OTGS_TestCase::setUp
  • FunctionMocker 已初始化(有关更多详细信息,请参阅“资源和依赖项”)
  • WP_Mock 已初始化(有关更多详细信息,请参阅“资源和依赖项”)
  1. \OTGS_TestCase::tearDown
  • WP_Mock 被销毁
  • FunctionMocker 被销毁
  • Mockery 被销毁(以防万一已使用过)
  1. \OTGS_TestCase::tearDownAfterClass
  • 删除使用 FactoryMuffin 创建的所有模型

模拟 WP 核心函数

此类还提供了一个辅助方法来快速模拟 WordPress 定义的函数,使用 \OTGS_TestCase::get_mocked_wp_core_functions,该方法返回一个 OTGS_Mocked_WP_Core_Functions 实例。

OTGS_Mocked_WP_Core_Functions 使用与在 WordPress 代码库中定义函数的文件相同的名称来组织模拟

例如,要模拟 post.php 中定义的所有函数(如 get_post),在您的测试中,您只需调用 $this->get_mocked_wp_core_functions()->post()

要模拟 add_query_arg,请调用 $this->get_mocked_wp_core_functions()->functions(),因为 add_query_arg 定义在 functions.php

OTGS_Mocked_WP_Core_Functions 尝试处理依赖关系。

因此,如果您调用$this->get_mocked_wp_core_functions()->post()来模拟wp_insert_post,您将自动调用$this->get_mocked_wp_core_functions()->post(),因此还可以模拟所有与元数据相关的函数。
最后,您可以使用$this->mock_all_core_functions()方法(尽管不推荐)使用“模拟所有”方法。

模拟WP常见类

\OTGS_TestCase提供了一种快速获取WordPress中最常用的一些类的存根的便捷方法。

通过调用$this->stubs->wpdb(),您将获得一个存根,可以将其作为您正在测试的类的依赖项传递。如果您需要控制该存根的行为,只需使用标准的PHPUnit模拟辅助工具即可。

示例1

$wpdb = $this->stubs->wpdb();  
$wpdb->method( 'get_var' )->willReturn( 1 );

示例2

$results = array(
	array( 'translation_id' => 1, 'element_id' => 1, 'language_code' => 'en', 'source_language_code' => null, 'trid' => 1, 'element_type' => 'post_page' ),
	array( 'translation_id' => 2, 'element_id' => 2, 'language_code' => 'fr', 'source_language_code' => 'en', 'trid' => 1, 'element_type' => 'post_page' ),
);
$wpdb = $this->this->wpdb();
$wpdb->expects( $this->exactly( 2 ) )->method( 'get_results' )->willReturn( $results );

您还可以获取的其他存根

  • 使用$this->stubs->WP_Widget()获取WP_Widget
  • 使用$this->stubs->WP_Theme()获取WP_Theme
  • 使用$this->stubs->WP_Filesystem_Direct()获取WP_Filesystem_Direct
  • 使用$this->stubs->WP_Query()获取WP_Query

重要的是要知道,如果您只需要定义类(例如,硬依赖项或子类),则不需要将存根分配给变量:只需调用该方法即可。

一个很好的例子是与WordPress的插件相关,其中您可能有自己的扩展WP_Widget的插件。

在这种情况下,除非您想模拟一些WP_Widget方法,否则只需调用$this->stubs->WP_Widget(),然后编写您的测试。
扩展WP_Widget的类将找到该类的定义,其中包含所有方法(执行无操作)。

资源和依赖项

以下是一些关于编写单元测试的资源,这些资源导致了该库的创建,以及包含在本库中的库的链接