Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing phpunitmock覆盖现有方法_Unit Testing_Mocking_Phpunit - Fatal编程技术网

Unit testing phpunitmock覆盖现有方法

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'

我正在为一个REST服务连接器编写一个单元测试,该连接器使用一个名为Httpful的第三方工具

因为我不想向服务器发送真正的请求,所以我模拟了Httpful\Request中的“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);