我的类中的构造函数向“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\\u my\\u type方法以及正在注册新的post类型?
编辑:
我困惑的主要原因是不理解phpunit、WordPress测试套件、类代码和测试代码之间的关系。
我现在了解的是,使用WordPress开发工具安装的方式this tutorial 或通过WP-CLI, 打电话给phpunit
加载引导文件,然后将插件挂接到muplugins_loaded
行动挂钩。然后引导文件加载WordPress测试环境。WordPress完成加载后init
挂钩已运行。使用的插件代码init
应按预期工作。
测试通常只是利用可用函数或类的普通代码。它们的不同之处在于,它们是作为一个类的方法编写的,该类扩展了WP_UnitTestCase
它扩展了PHPUnit_Framework_TestCase
. 封装在这个类中,使测试能够访问断言和对象工厂,并运行setUp
和tearDown
方法,使每个测试独立于其他测试。
最合适的回答,由SO网友:J.D. 整理而成
让我首先说init
在运行测试之前,加载WordPress时调用操作。因此,您正在使用WordPress加载插件/主题(通过连接到muplugins_loaded
, 例如register_my_type()
如果之前调用了构造函数,则应该调用方法init
. (如果您没有以这种方式加载插件,请查看this tutorial.)
因此,在单元测试中,您应该能够做到这一点:
$this->assertTrue( post_type_exists( \'my_post_type\' ) );
您也可以使用
get_post_type()
检查是否使用正确的参数注册了post类型。(这与我检查短代码是否已注册时所做的操作是一样的。)
虽然您可以在中查看操作列表,但我不担心尝试测试是否调用了该方法$wp_actions
看看它是否连接好了。您也可以在调用类属性时将其设置为标志,但我真的认为这一切都太过分了。当涉及到与以下行为挂钩的事情时init
, 尤其是像这样只需运行一次的函数,功能测试是最好的选择。检查他们是否完成了他们应该做的事情,而不是专注于测试单个单元,比如是否调用了该方法。
也就是说,您还可以通过取消注册post类型并手动调用该方法来测试该方法是否注册了post类型。WordPress似乎没有提供deregister_post_type()
函数,所以您必须处理$wp_post_types
全球直接。您可以从中删除您的帖子类型,然后调用您的方法并检查它是否再次注册。