Unit testing phpunitmock覆盖现有方法
我正在为一个REST服务连接器编写一个单元测试,该连接器使用一个名为Httpful的第三方工具 因为我不想向服务器发送真正的请求,所以我模拟了Httpful\Request中的“send”方法:Unit testing phpunitmock覆盖现有方法,unit-testing,mocking,phpunit,Unit Testing,Mocking,Phpunit,我正在为一个REST服务连接器编写一个单元测试,该连接器使用一个名为Httpful的第三方工具 因为我不想向服务器发送真正的请求,所以我模拟了Httpful\Request中的“send”方法: $mockedRequest = $this->getMock('Httpful\Request', array('send'), array(), '', false); $mockedRequest->expects($this->once())->method('send'
$mockedRequest = $this->getMock('Httpful\Request', array('send'), array(), '', false);
$mockedRequest->expects($this->once())->method('send');
这很好,但请求类有一个名为expects的方法,我在实际代码中使用它来定义响应的可接受mime类型
$this
->getRequest('GET')
->uri(ENDPOINT . $configurationId) //by default this returns a Request Object (now mocked request)
->expects('application/json') //crashes ...
->send();
当代码被执行时,我得到以下错误(这是可以理解的):
传递给Mock_Request_938fb981::expects()的参数1必须实现接口PHPUnit_Framework_MockObject_Matcher_调用,字符串给定
对于来自模拟类(如“expects”)的方法,是否有类似于可配置前缀的东西?我认为使用PHPUnit\u 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;
}
}
如果构造函数
然后在测试中,您可以验证是否使用
$this->assertTrue($mockedRequest->isSendCalled);
$this->assertTrue($mockedRequest->isUriCalled);
$this->assertTrue($mockedRequest->isExpectsCalled);
这不是一个非常动态的模拟,但它将通过类型提示,并为您进行检查。我将在与您的测试相同的文件中创建这个模拟(不过请注意不要在测试套件的其他地方意外地重新定义这个类)。但它可以让你绕过被覆盖的问题
PHPUnit\u Framework\u MockObject\u MockObject
是一个为expects()
设置签名的接口,您的类也不会满足该接口,因此如果您能够重命名该方法,则会出现错误
$this->assertTrue($mockedRequest->isSendCalled);
$this->assertTrue($mockedRequest->isUriCalled);
$this->assertTrue($mockedRequest->isExpectsCalled);