如何在模拟对象中设置变量

时间:2010-03-09 16:14:21

标签: php unit-testing oop mocking phpunit

有没有办法在模拟对象中设置类级变量?

我将模拟对象设置为类似于:

$stub = $this->getMock('SokmeClass', array('method'));
$stub->expects($this->once())
         ->method('method')
         ->with($this->equalTo($arg1));

赢得真正的类,有一个变量需要设置才能正常工作。如何在模拟对象中设置该变量?

4 个答案:

答案 0 :(得分:15)

这对我有用:

$stub = $this->getMock('SomeClass');
$stub->myvar = "Value";

答案 1 :(得分:5)

不知道为什么会这样,但对我来说似乎。如果你将__get魔术方法作为被覆盖的方法之一,例如

$mock = $this->getMock('Mail', array('__get'));

然后你可以成功地做到

$mock->transport = 'smtp';

答案 2 :(得分:3)

存根的想法是用一个测试double替换一个依赖,提供相同的方法接口(可选)返回配置的返回值。这样,SUT可以像双重依赖一样使用double。如果您需要存根中的特定返回值,您只需告诉它应返回的内容,例如:

// Create a stub for the SomeClass class.
$stub = $this->getMock('SomeClass');

// Configure the stub.
$stub->expects($this->any())
     ->method('doSomething')
     ->will($this->returnArgument(0));

$stub->doSomething('foo'); // returns foo

请参阅http://www.phpunit.de/manual/current/en/test-doubles.html

答案 3 :(得分:0)

考虑到您对@Gordon的评论中的讨论,我将建议以下内容。

我认为你需要意识到的是,你真的在​​测试getter / setter,而不是你正在实现的实际逻辑。

您可能应该将代码分解为可以测试的较小块。

然后继续测试您期望从较小方法获得的数据。 (您可以测试受保护的方法。)

在实际代码中,您可以调用那些较小的块(方法)并在另一个公共函数中填充您想要的对象(不应该对其进行测试,因为设置和获取对象的变量应该很简单,甚至不值得测试。)