2010-03-09 55 views
7

有什么方法可以在模拟对象内设置类级变量?如何在模拟对象中设置变量

我有模拟对象设置与此类似:

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

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

回答

2

存根的思想是用一个测试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 

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

+0

我想我应该让这个例子更容易理解。该类与此类似: class SomeClass { $ someVar; 公共功能setSomeVar(颜色$蓝色){ $ someVar =“Blue”; } public function getSomeVar(){ return $ someVar; }} 在Mock对象,我不能设置变量,所以当我使用它的其他地方,我的对象得到一个空...... – Enrique 2010-03-10 21:13:17

+0

@Enrique嗯,无论是广告还是我没有得到它:)你可以告诉Mock创建它时应该返回的内容。无需在其中设置任何内容。如果你想让它返回蓝色,告诉它返回蓝色。 – Gordon 2010-03-10 21:53:55

+0

@戈登还行。也许我错过了一些东西。让我试着解释一下我所处的情况,而不会溢出太多的豆子。我有一个将数据发送到表的方法'队列'。为'队列'运行一个类级变量$ transport必须被设置,否则它会抛出一个错误(不知道该去哪里)。我需要$运输设置为null以外的东西,二传手犯规返回的参数(没有消气的“排队”方法来调用。旧的遗留代码...) – Enrique 2010-03-11 15:30:54

5

不知道为什么这个工作,但它似乎为我。如果您将__get魔术方法作为重写方法之一,例如

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

你可以,那么你可以做成功

$mock->transport = 'smtp'; 
11

这里是什么对我的作品:

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

我认为这是最简单回答被问到的问题的答案。海报问的是实例变量而不是方法。其他几个答案似乎集中在方法上。 @ Nat的答案和这个一样,除了你不需要重写__get方法(至少不是最新版本) – 2015-01-07 16:14:57

+0

很好的完成,PhpUnit。 – 2015-03-25 18:23:14

0

我要建议以下考虑您有相关的评论的讨论@Gordon。

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

你应该把你的代码分解成你可以测试的更小的块。

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

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