属性 提供程序中的设置成功在测试中被覆盖为 null
Property successfully set in provider overwritten as null in the test
我在提供者中成功初始化 属性 mock
之后(我这样做是因为我想将 属性 作为参数传递,如果它没有在提供者中初始化,则会出错因为 prop 为 null 而发生)并将其传递给测试,我遇到了一个问题:the 属性 被覆盖为 null。
class Test extends \PHPUnit_Framework_TestCase
{
protected $mock;
/**
* @param $arg List of objects from DB
*
* @dataProvider providerTest
*/
public function test($arg)
{
var_dump($this->mock) // ---> NULL
}
public function providerTest()
{
$this->mock = $this->getMockBuilder(Currency::class)
->disableOriginalConstructor()
->getMock();
var_dump($this->mock) // -----> OBJECT
return array(
array('argument')
);
}
}
我假设您想知道为什么会发生这种情况。 PHPUnit的documentation其实是这样解释的:
Note
All data providers are executed before both the call to the setUpBeforeClass static method and the first call to the setUp method. Because of that you can't access any variables you create there from within a data provider. This is required in order for PHPUnit to be able to compute the total number of tests.
因此,您应该将 MockObject
的创建移动到 setUp()
方法中,或者直接移动到使用数据提供程序的测试方法中:
class Test extends \PHPUnit_Framework_TestCase
{
protected $mock;
protected function setUp()
{
$this->mock = $this->getMockBuilder(Currency::class)
->disableOriginalConstructor()
->getMock();
}
/**
* @param $arg List of objects from DB
*
* @dataProvider providerTest
*/
public function test($arg)
{
var_dump($this->mock) // ---> MockObject
}
public function providerTest()
{
return array(
array('argument')
);
}
}
我在提供者中成功初始化 属性 mock
之后(我这样做是因为我想将 属性 作为参数传递,如果它没有在提供者中初始化,则会出错因为 prop 为 null 而发生)并将其传递给测试,我遇到了一个问题:the 属性 被覆盖为 null。
class Test extends \PHPUnit_Framework_TestCase
{
protected $mock;
/**
* @param $arg List of objects from DB
*
* @dataProvider providerTest
*/
public function test($arg)
{
var_dump($this->mock) // ---> NULL
}
public function providerTest()
{
$this->mock = $this->getMockBuilder(Currency::class)
->disableOriginalConstructor()
->getMock();
var_dump($this->mock) // -----> OBJECT
return array(
array('argument')
);
}
}
我假设您想知道为什么会发生这种情况。 PHPUnit的documentation其实是这样解释的:
Note
All data providers are executed before both the call to the setUpBeforeClass static method and the first call to the setUp method. Because of that you can't access any variables you create there from within a data provider. This is required in order for PHPUnit to be able to compute the total number of tests.
因此,您应该将 MockObject
的创建移动到 setUp()
方法中,或者直接移动到使用数据提供程序的测试方法中:
class Test extends \PHPUnit_Framework_TestCase
{
protected $mock;
protected function setUp()
{
$this->mock = $this->getMockBuilder(Currency::class)
->disableOriginalConstructor()
->getMock();
}
/**
* @param $arg List of objects from DB
*
* @dataProvider providerTest
*/
public function test($arg)
{
var_dump($this->mock) // ---> MockObject
}
public function providerTest()
{
return array(
array('argument')
);
}
}