有什么方法可以在模拟对象内设置类级变量?如何在模拟对象中设置变量
我有模拟对象设置与此类似:
$stub = $this->getMock('SokmeClass', array('method'));
$stub->expects($this->once())
->method('method')
->with($this->equalTo($arg1));
赢得真正的类存在需要进行设置才能正常工作的变量。如何在模拟对象中设置该变量?
有什么方法可以在模拟对象内设置类级变量?如何在模拟对象中设置变量
我有模拟对象设置与此类似:
$stub = $this->getMock('SokmeClass', array('method'));
$stub->expects($this->once())
->method('method')
->with($this->equalTo($arg1));
赢得真正的类存在需要进行设置才能正常工作的变量。如何在模拟对象中设置该变量?
存根的思想是用一个测试double替换一个依赖,提供相同的方法接口(可选地)返回配置的返回值。通过这种方式,SUT可以像使用依赖关系一样使用双精度。如果从存根需要一个特定的返回值,你只要告诉它应该返回什么,例如:
// 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
不知道为什么这个工作,但它似乎为我。如果您将__get
魔术方法作为重写方法之一,例如
$mock = $this->getMock('Mail', array('__get'));
你可以,那么你可以做成功
$mock->transport = 'smtp';
这里是什么对我的作品:
$stub = $this->getMock('SomeClass');
$stub->myvar = "Value";
我认为这是最简单回答被问到的问题的答案。海报问的是实例变量而不是方法。其他几个答案似乎集中在方法上。 @ Nat的答案和这个一样,除了你不需要重写__get方法(至少不是最新版本) – 2015-01-07 16:14:57
很好的完成,PhpUnit。 – 2015-03-25 18:23:14
我要建议以下考虑您有相关的评论的讨论@Gordon。
我认为你需要意识到的是你真的在测试getters/setters而不是你正在实现的实际逻辑。
你应该把你的代码分解成你可以测试的更小的块。
然后继续从较小的方法测试您期望的数据。 (您可以测试受保护的方法。)
在实际代码中,您可以调用这些较小的块(方法)并在另一个公共函数中填充所需的对象(不应该测试它,因为设置变量并将其获取到对象应该很简单,甚至不值得测试。)
我想我应该让这个例子更容易理解。该类与此类似: class SomeClass { $ someVar; 公共功能setSomeVar(颜色$蓝色){ $ someVar =“Blue”; } public function getSomeVar(){ return $ someVar; }} 在Mock对象,我不能设置变量,所以当我使用它的其他地方,我的对象得到一个空...... – Enrique 2010-03-10 21:13:17
@Enrique嗯,无论是广告还是我没有得到它:)你可以告诉Mock创建它时应该返回的内容。无需在其中设置任何内容。如果你想让它返回蓝色,告诉它返回蓝色。 – Gordon 2010-03-10 21:53:55
@戈登还行。也许我错过了一些东西。让我试着解释一下我所处的情况,而不会溢出太多的豆子。我有一个将数据发送到表的方法'队列'。为'队列'运行一个类级变量$ transport必须被设置,否则它会抛出一个错误(不知道该去哪里)。我需要$运输设置为null以外的东西,二传手犯规返回的参数(没有消气的“排队”方法来调用。旧的遗留代码...) – Enrique 2010-03-11 15:30:54