【发布时间】:2019-02-05 06:22:35
【问题描述】:
我有一个单元测试类,我想在其中实例化另一个类的对象,以便我使用 phpunit 的 setUpBeforeClass() 固定装置。因此,如果我将直接在测试函数中使用该最近实例化的对象,那么它的工作正常。
如果我将此对象用于为数据提供者创建的另一个函数。所以该对象设置为 null 导致提供程序总是首先执行。
有没有办法在测试运行之前调用 dataProviders?
require_once('Dashboard.php');
Class Someclass extends PHPUnit_Framework_TestCase {
protected static $_dashboard;
public static function setUpBeforeClass()
{
self::$_dashboard = new Dashboard();
self::$_dashboard->set_class_type('Member');
}
/**
* Test Org Thumb Image Existense
* param org profile image : array
* @dataProvider getOrgProfileImages
*/
public function testFieldValidation($a,$b){
//If I call that object function here it will give the result.
//$members = self::$_dashboard->get_members();
//var_dump($members); Printing result as expected
$this->assertTrue(true);
}
public function getOrgProfileImages() : array {
//var_dump(self::$_dashboard);
$members = self::$_dashboard->get_members();
$tmp_array = ['2','2'];
return $tmp_array;
}
public static function tearDownAfterClass()
{
self::$_dashboard = null;
}
}
错误: 为 Someclass::testFieldValidation 指定的数据提供者无效。 在 null 上调用成员函数 get_members()
请帮助缓解此问题。
【问题讨论】:
-
我不太确定您在问什么,但听起来您可能想使用
setUp而不是setUpBeforeClass。setUp在每次测试之前运行,而不是对文件中的所有测试只运行一次。这可以防止您的第一个测试改变对象的状态,因此它不会干扰您的其他测试。看看phpunit.de/manual/6.5/en/fixtures.html(例子4.2) -
感谢您的评论,实际上我已经完成了 setUp 夹具。当然它会起作用,但是如果有多个测试用例,那么每个测试都会创建该类的一个对象。我想实例化一次,这样我就可以在同一个类的任何地方使用它。
-
“开销”不是问题。您实际上希望每个测试都有新的实例。