PHPUnit Mock会覆盖现有方法

时间:2014-04-23 15:30:04

标签: unit-testing mocking phpunit

我正在为使用名为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,给定字符串

对于来自模拟类的方法是否有类似可配置的前缀,例如"期望"?

1 个答案:

答案 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()签名的界面,您的班级也不会遇到此签名,因此如果您能够重命名该方法,则会出现错误。

https://github.com/sebastianbergmann/phpunit-mock-objects/blob/master/src/Framework/MockObject/MockObject.php