我的类中的构造函数将一个动作添加到'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.被包装在这个类中使测试可以访问断言和对象工厂,并运行 setUptearDown 方法,使每个测试是独立的其他。

有帮助吗?

解决方案

让我先说一下 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 直接全球化。您可以从中删除您的帖子类型,然后调用您的方法并检查它是否再次注册。

许可以下: CC-BY-SA归因
scroll top