有人可以为我提供一个好的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) 如何使用多个参数调用模拟对象的方法?
答案 0 :(得分:12)
[注意:链接的网站上的所有代码示例,请点击链接以获得更详尽的解释。]
(当前)PHPUnit文档建议using a callback或onConsecutiveCalls()
:
$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...
如果你想从模拟内部失败测试,只需抛出异常......