我正在为使用名为Httpful的第三方工具的REST服务连接器编写单元测试。
因为我不想向服务器发送实际请求,所以我嘲笑了"发送"来自Httpful \ Request的方法:
$mockedRequest = $this->getMock('Httpful\Request', array('send'), array(), '', false);
$mockedRequest->expects($this->once())->method('send');
这很好用,但 Request 类有一个名为 expect 的方法本身,我在实际代码中使用它来定义响应的可接受mime类型。 / p>
$this
->getRequest('GET')
->uri(ENDPOINT . $configurationId) //by default this returns a Request Object (now mocked request)
->expects('application/json') //crashes ...
->send();
当代码执行时,我收到以下错误(这是可以理解的):
传递给Mock_Request_938fb981 :: expected()的参数1必须实现接口PHPUnit_Framework_MockObject_Matcher_Invocation,给定字符串
对于来自模拟类的方法是否有类似可配置的前缀,例如"期望"?
答案 0 :(得分:1)
我不认为你可以使用PHPUnit_MockObject类来做到这一点。但是你可以编写自己的代码并使用它。
class MockRequest extends \Httpful\Request {
public $isSendCalled = false;
public $isUriCalled = false;
public $isExpectsCalled = false;
public function uri($url) {
if($url !== '<expected uri>') {
throw new PHPUnit_Framework_AssertionFailedError($url . " is not correct");
}
$this->isUriCalled = true;
return $this;
}
public function expects($type) {
if($type !== 'application/json') {
throw new PHPUnit_Framework_AssertionFailedError($type . " is not correct");
}
$this->isExpectsCalled = true;
return $this;
}
public function send() {
$this->isSendCalled = true;
}
}
您创建模拟的行只会变为:
$mockedRequest = new MockRequest();
如果构造函数为
然后在测试中,您可以验证是否使用
调用方法$this->assertTrue($mockedRequest->isSendCalled);
$this->assertTrue($mockedRequest->isUriCalled);
$this->assertTrue($mockedRequest->isExpectsCalled);
这不是一个非常动态的模拟,但它将通过类型提示并为您进行检查。我会在与测试相同的文件中创建这个模拟(但要注意不要在测试套件的其他地方不小心重新定义这个类)。但是它可以解决你期望被覆盖的问题。
PHPUnit_Framework_MockObject_MockObject
是一个设置expects()
签名的界面,您的班级也不会遇到此签名,因此如果您能够重命名该方法,则会出现错误。