PHPUnit:如何测试方法调用顺序不正确?

时间:2013-03-29 23:02:52

标签: php mocking phpunit

我想使用PHPUnit来测试以正确的顺序调用方法。

我在模拟对象上使用->at()的第一次尝试不起作用。例如,我预计以下内容会失败,但它不会:

  public function test_at_constraint()
  {
    $x = $this->getMock('FirstSecond', array('first', 'second'));
    $x->expects($this->at(0))->method('first');
    $x->expects($this->at(1))->method('second');

    $x->second();
    $x->first();
  }      

我能想到的唯一方法就是如果错误的顺序调用事情就会失败就是这样:

  public function test_at_constraint_with_exception()
  { 
    $x = $this->getMock('FirstSecond', array('first', 'second'));

    $x->expects($this->at(0))->method('first');
    $x->expects($this->at(1))->method('first')
      ->will($this->throwException(new Exception("called at wrong index")));

    $x->expects($this->at(1))->method('second');
    $x->expects($this->at(0))->method('second')
      ->will($this->throwException(new Exception("called at wrong index")));

    $x->second();
    $x->first();
  }

有更优雅的方法吗?谢谢!

1 个答案:

答案 0 :(得分:7)

您需要参与任何InvocationMocker才能使您的期望有效。例如,这应该有效:

public function test_at_constraint()
{
    $x = $this->getMock('FirstSecond', array('first', 'second'));
    $x->expects($this->at(0))->method('first')->with();
    $x->expects($this->at(1))->method('second')->with();

    $x->second();
    $x->first();
}