【问题标题】:How can I test for WP_Error?如何测试 WP_Error?
【发布时间】:2019-04-19 15:12:09
【问题描述】:

我正在使用 phpunit 和 WP_Mock 为 WordPress 插件编写测试,如果我的类中的方法没有被正确调用(接收它需要的所有参数),我想返回一个 WP_Error

当然,这样做的标准方法是在那时创建并返回一个新的WP_Error - 但是当我运行测试时没有加载 WordPress,WP_Error 类不存在。

正在模拟其他 WordPress 类并注入 Mockery,但这似乎有点过分测试 WP_Error 被抛出;但我没有看到任何其他中途明智的计划。

有没有模拟WP_Error的好方法?

【问题讨论】:

  • “但由于尚未加载 Wordpress,因此该类不存在” - 那么此时您实际上想要测试什么……?
  • 我为扩展它而编写的代码;我作为依赖项模拟和注入的所有其他内容,这是我正在考虑的一个选项,但感觉应该有更好的解决方案。
  • 我将从使用template_redirect action hook 开始,“此操作挂钩在 WordPress 确定要加载的模板页面之前执行”。

标签: php wordpress unit-testing phpunit


【解决方案1】:

最简单的方法: 在引导您的测试时,只需 include_once 定义为 WP_Error (wp-includes/class-wp-error.php) 的文件。这样,当您需要实例化该类时,该类将被定义。

WP_Error 没有任何其他依赖项,因此包含它应该很重要。

您不是在测试该类的实际行为,而是只返回该类的一个对象。因此,如果存在正确的定义,则无需模拟任何内容。

更好的方法: 使用WP-CLI 搭建脚手架。这样做你就可以访问 wordpress 函数和类。

您需要安装 WP-CLI 并安装有效的 WP,其中包含您的插件文件。

首先你需要做插件脚手架。在你的 WP 目录中运行

wp scaffold plugin-tests your-plugin

这将在您的插件目录中创建一组文件,类似于:

|-bin/
|----install-wp-tests.sh
|-tests/
|----bootstrap.php
|----test-sample.php
|-.travis.yml
|-phpcs.xml.dist
|-phpunit.xml.dist
|-your-plugin.php

您需要 cd 到您的插件目录,然后从那里运行测试环境初始化:

bin/install-wp-tests.sh db_name db_user 'db_password' db_host wp_version

参数是不言自明的。 wp_version 可以是latest。在这个 DB 上 wp-cli 将创建一组用于测试的表,它会在您的 /tmp 目录中创建一个 WP 安装,并使用上述值进行配置,每次运行 phpunit 时都会使用这些值。

之后,只需调用phpunit 并运行您的测试即可。您可以使用test-sample.php作为起点,或者将您的复制到那里。

以这种方式运行测试时,WP_Error 将被定义,您可以轻松测试您的方法是否正确返回它。

测试愉快!

【讨论】:

  • 我不能用WP-CLI,因为我用的是WP_Mock,两个测试框架互不兼容。但是,包含一次似乎是可用的最不坏的解决方案。所以赏金是你的!
  • WP-CLI 不是一个测试框架。但可惜 WP_Mock 不兼容。
  • 根据您的回答,我的意思是通过 WP-CLI 脚手架安装的 Wordpress 测试框架。
  • 是的,明白。我将不得不阅读有关 WP_Mock 的更多信息。但是只包含文件应该可以让你摆脱这种情况,因为你不需要实际模拟 WP_Error。
【解决方案2】:

方法一:

plugins_loaded 操作之后执行您的测试,例如:

add_action('plugins_loaded', 'your_func');
function your_func()
{
   ...
}

方法二:

包含一次WP_error 类:

include_once(ABSPATH.'wp-includes/class-wp-error.php');
...
your code

【讨论】:

    【解决方案3】:

    从 T.Todua 的回答中学习,我的 composer.json 看起来像:

    {
        "require-dev": {
            "cyruscollier/wordpress-develop": "dev-master",
            "10up/wp_mock": "0.4.2",
            "dealerdirect/phpcodesniffer-composer-installer": "*",
            "wp-coding-standards/wpcs": "1.*"
        }
    }
    

    在我的 tests/UnitTest.php setUp() 方法中,我有:

    $basedir = dirname( dirname( __FILE__ ) );
    
    require_once( $basedir . '/vendor/wordpress/wp-includes/class-wp-error.php' );
    

    【讨论】:

      猜你喜欢
      • 2018-10-12
      • 2017-02-06
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-20
      相关资源
      最近更新 更多