PHPUnit具有相同名称的多个模拟方法

时间:2012-02-28 01:29:58

标签: php phpunit

我想知道如何测试这个。假设我有一个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'));

我应该如何设置模拟,以便第二个调用返回不同的值(已保存)?

2 个答案:

答案 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();