如何正确测试由操作挂钩调用的方法

时间:2014-09-08 作者:Simon Cossar

我的类中的构造函数向“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. 封装在这个类中,使测试能够访问断言和对象工厂,并运行setUptearDown 方法,使每个测试独立于其他测试。

1 个回复
最合适的回答,由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 全球直接。您可以从中删除您的帖子类型,然后调用您的方法并检查它是否再次注册。

结束

相关推荐

Wordpress Admin Tooltip hooks

我想知道是否有一种方法可以使用Wordpress管理工具提示(灰色和蓝色),当你更新你的Wordpress(3.x)时会显示这些提示。显示新功能。谢谢