我想知道如何测试这个。假设我有一个getter方法,并且我在方法的过程中更改了值。这是一个简单的例子:
public function foo($model)
{
var_dump($model->state());
$model->state('saved');
var_dump($model->state());
}
我像这样嘲笑模型:
$model = $this->getMock('Model');
$model->expects($this->any))
->method('state')
->will($this->returnValue('new'));
我应该如何设置模拟,以便第二个调用返回不同的值(已保存)?
答案 0 :(得分:3)
$model = $this->getMock('Model');
$model->expects($this->at(0))
->method('state')
->will($this->returnValue('new'));
$model->expects($this->at(1))
->method('state')
->will($this->returnValue('saved'));
$model->expects($this->exactly(2))
->method('state');
http://www.phpunit.de/manual/3.6/en/test-doubles.html#test-doubles.mock-objects
另外,您还可以使用with()
检查传递的参数是否等于saved
->with($this->equalTo('saved'))
PS:这适用于
public function foo($model)
{
var_dump($model->state());
var_dump($model->state('saved'));
}
对于您的代码,您需要设置3个模拟调用,而不是2
答案 1 :(得分:3)
使用Mockery,它与PHPUnit集成但是是一个非常优秀的模拟库,你可以这样写:
$model = m::mock('model');
$model->shouldReceive('state')->andReturn($returnValue, $differentReturnValue);
很明显Mockery API有多漂亮。这是可读代码的颂歌。它读起来像文字......
模型应该接收状态和返回值
您可以添加一个约束,该方法必须完全调用两次,如下所示:
$model->shouldReceive('state')->twice()->andReturn($value, $differentValue);
如果你想传递参数,它看起来像这样:
$model->shouldReceive('state')->withNoArgs()->andReturn($value)->once();
$model->shouldReceive('state')->with('saved')->andReturn($differentValue)->once();