有关PHPUnit模拟功能的问题

时间:2010-06-15 16:27:39

标签: php mocking phpunit

有人可以为我提供一个好的PHPUnit模拟指南吗? official documentation中的那个似乎不够详细。我正在尝试通过阅读源代码来学习PHPUnit,但我不熟悉术语匹配器,调用模拟器,存根返回等。

我需要了解以下内容:

1) 如何期望对模拟对象的方法进行多次调用,但每次都返回不同的值集?

$tableMock->expects($this->exactly(2))
    ->method('find')
    ->will($this->returnValue(2)); // I need the second call to return different value

2) 如何使用多个参数调用模拟对象的方法?

2 个答案:

答案 0 :(得分:12)

[注意:链接的网站上的所有代码示例,请点击链接以获得更详尽的解释。]

返回不同的值

(当前)PHPUnit文档建议using a callbackonConsecutiveCalls()

$stub->expects($this->any())
      ->method('doSomething')
      ->will($this->returnCallback('str_rot13'));

$stub->expects($this->any())
     ->method('doSomething')
     ->will($this->onConsecutiveCalls(2, 3, 5, 7));

期待多个参数

with()可能包含multiple parameters

$observer->expects($this->once())
         ->method('reportError')
         ->with($this->greaterThan(0),
                $this->stringContains('Something'),
                $this->anything());

测试多个呼叫

虽然没有问,但是在相关主题上(而不是我能找到的PHPUnit文档中),您可以at()使用set expectations for multiple calls to a method

$inputFile->expects($this->at(0))
          ->method('read')
          ->will($this->returnValue("3 4"));
$inputFile->expects($this->at(1))
          ->method('read')
          ->will($this->returnValue("4 6"));
$inputFile->expects($this->at(2))
          ->method('read')
          ->will($this->returnValue(NULL));

答案 1 :(得分:3)

您始终可以创建自己的模拟类(不需要使用内置的Mock对象):

class tableMock extends Table {
    public function __construct() {
    }

    public function find($id) {
        return $id;
    }
}

$tableMock = new tableMock();

//Do your testing here...

如果你想从模拟内部失败测试,​​只需抛出异常......