如何正确测试由操作挂钩调用的方法
-
29-09-2020 - |
题
我的类中的构造函数将一个动作添加到'init'动作挂钩:
class My_Custom_Post_Type {
function __construct( $type ) {
$this->type = $type;
add_action( 'init', array( $this, 'register_my_type' );
}
function register_my_type() {
register_post_type( $this->type);
}
}
我试图在单元测试中测试这一点,最终意识到'init'动作钩子没有理由触发。有什么方法可以测试register_my_type方法正在被调用,并且正在注册新的post类型?
编辑:
我困惑的主要来源来自不了解phpunit,WordPress测试套件,我的类代码和我的测试代码之间的关系。
我现在明白的是,使用WordPress开发人员工具安装的方式是 本教程 或通过 WP-CLI, ,一个电话 phpunit
加载一个引导文件,然后将插件挂接到 muplugins_loaded
动作钩。引导文件然后加载WordPress测试环境。WordPress完成加载后 init
钩运行。使用的插件代码 init
应该按预期工作。
测试大多只是使用可用函数或类的普通代码。它们的不同之处在于它们被写成扩展类的方法 WP_UnitTestCase
其中延伸 PHPUnit_Framework_TestCase
.被包装在这个类中使测试可以访问断言和对象工厂,并运行 setUp
和 tearDown
方法,使每个测试是独立的其他。
解决方案
让我先说一下 init
开始! 是 在加载WordPress时,在测试运行之前调用。所以你有你的插件/主题加载与WordPress(通过挂钩到 muplugins_loaded
, 例如),该 register_my_type()
方法应该被调用,如果你的构造函数之前被调用 init
.(如果您没有以这种方式加载插件,请查看 本教程.)
所以在你的单元测试中,你应该能够做到这一点:
$this->assertTrue( post_type_exists( 'my_post_type' ) );
你也可以使用 get_post_type()
检查post类型是否注册了正确的参数。(这与我检查我的简码是否已注册相同。)
我不会担心尝试测试该方法是否被调用,尽管您可以在 $wp_actions
看看它是否连接正确。您也可以在调用时将类属性设置为标志,但我真的认为所有这些都是矫枉过正的。当涉及到像这样的行为所吸引的事情时 init
, ,特别是像这样只需要运行一次的功能,功能测试是你最好的选择。检查他们是否已经完成了他们应该做的事情,而不是专注于尝试测试单个单元,例如是否调用了该方法。
也就是说,您还可以通过注销post类型并手动调用该方法来测试该方法是否注册了post类型。WordPress似乎没有提供一个 deregister_post_type()
功能,所以你得弄乱 $wp_post_types
直接全球化。您可以从中删除您的帖子类型,然后调用您的方法并检查它是否再次注册。