我已经研究这个问题好几天了,虽然很多人问这个问题,但我从来没有找到一个清晰简洁的答案。
我正在跑步:
PHP单元:3.7.21版;WordPress:3.5.1版;操作系统:Ubuntu 11.10;MySQL:5.1.69-0ubuntu0版。11.10.1 PHP:版本5.3.6-13ubuntu3。长话短说,我已经将基本的wordPress核心下载到我电脑上的一个目录中。我已经成功下载并安装了pear和phpunit。我通过在简单的php文件上编写基本测试来测试phpunit,这些文件运行良好。我的问题是当我在wordpress站点上运行phpunit时(我没有更改其核心WP文件)。
我得到错误:
“PHP致命错误:在/<;root\\u目录>/functions.PHP第779行的非成员对象上调用成员函数main()”。
此错误对应于此代码段:
function wp( $query_vars = \'\' ) {
global $wp, $wp_query, $wp_the_query;
$wp->main( $query_vars ); // Line 779
if ( !isset($wp_the_query) )
$wp_the_query = $wp_query;
}
经过一番激烈的网络爬网,我发现很多人在这条线上都有错误,所以我知道有一些常见的事情,比如环境设置或我们的设置过程,导致了所有这些错误。
我有一些解决方案read and tried 这对我不起作用:
更改“index.php”文件中所需的文件在“index.php”文件中,在标题上方放置“load.php”的要求重新安装WordPress更改引导程序和phpunit环境我已经做了5年的web开发人员,但我以前从未为我的客户使用过WordPress。一旦我能建立起这个框架,编写单元测试就很容易了;但我不知道是什么导致了这个问题。如有任何指向指南/教程或清晰解释的链接,将不胜感激。感谢您抽出时间。
--编辑--我正在运行的测试文件是:
<?php
//include PHPUnit
require_once(\'PHPUnit/Autoload.php\');
//include the code to be tested
require_once(\'../index.php\');
// extend the PHPUnit class
class StackTest extends PHPUnit_Framework_TestCase {
public function testOne(){
$this->assertTrue(TRUE);
$this->assertEquals(2,2);
$this->assertTrue(1<3);
}
}
?>
我没有使用任何WordPress特定的功能测试;我只是在不访问WordPress网站主页的情况下运行了一些基本的测试,但如果访问了主页,就会失败。
还有另一个注释;我正确设置了配置文件和数据库。该网站运行得非常好,只是PHPUnit测试无法成功运行网站文件。
最合适的回答,由SO网友:John P Bloch 整理而成
WordPress的单元测试是一件棘手的事情。如果需要使用实时数据库等测试代码,我建议使用the official WordPress test suite. 我已经运行了单元测试for a plugin using that method 以前,但它并不漂亮,而且相当不可靠。但是,如果您需要这样做,我个人不会考虑使用官方测试套件以外的任何东西。
有大量的信息on the official repository on the core make blog. 在测试套件的引导文件中,您需要设置任何需要覆盖的选项。通常,这将是活动插件(因此您可以测试您的插件):
$GLOBALS[\'wp_tests_options\'] = array(
\'active_plugins\' => array( \'plugin-folder/plugin-file.php\' ), // Relative to WP Plugin directory
);
之后,您需要包括
includes/bootstrap.php
核心测试套件中的文件。完成后,测试应该按“预期”运行。
然而,根据我的经验,这些类型的测试从来没有像预期的那样运行,因为数据库和所有WordPress代码为您的测试引入了大量隐藏的依赖项和状态。因此,我更喜欢模拟WordPress api,在没有所有依赖项和状态的情况下运行测试。
为此,我使用WP_Mock. 它允许您使用细粒度控制来模拟WordPress环境。例如,如果您有一个需要向中添加筛选器的函数\'the_content\'
然后打电话the_content()
, WP\\U Mock的以下代码可用于测试:
WP_Mock::expectFilterAdded( \'the_content\', \'some_callback_you_expect\', 10, 2 );
WP_Mock::wpFunction( \'the_content\', array(
\'times\' => 1,
\'args\' => array(),
) );
your_function();
如果未满足WP\\U Mock中规定的期望,则会引发异常,导致测试失败。