0

我对模拟对象有疑问...

我有类“示例”,我需要测试 callMethod()

public function callMethod() {
  $item = 0;
  foreach($this->returnSomething() as $list) {
    $item = $item + $list->sum;
  }
  return $item; 
}

我有测试方法,我在其中模拟“returnSomething”以返回一些数据,但问题在于它不调用模拟方法。

这是我模拟“returnSomething”并调用“callMethod”的测试方法的一部分。

$mock = mock("Example");
$mock->shouldReceive("returnSomething")->once()->withNoArgs()->andReturn($returnItems);
$result = $mock->callMethod();

是否可以在不更改“callMethod”定义并将 $mock 对象转发到该方法的情况下调用模拟的“returnSomething”?

4

2 回答 2

2

可以只模拟指定的方法。

例子:

嘲讽:

$mock = \Mockery::mock("Example[returnSomething]");

PHP单元:

$mock = $this->getMock('Example', array('returnSomething'));

或者

$mock = $this->getMockBuilder('Example')
    ->setMethods(array('returnSomething'))
    ->getMock();

在上述情况下,框架将仅模拟returnSomething方法并将其余方法保留在原始对象中。

于 2013-09-09T13:54:05.953 回答
2

我写这个是因为今天我在这里找到了答案,但是 setMethods() 已被弃用(phpunit 8.5),替代方案是 onlyMethods(),它可以按如下方式使用:

$mock = $this->getMockBuilder(Example::class)
             ->onlyMethods(['yourOnlyMethodYouWantToMock'])
             ->getMock();

$mock->method('yourOnlyMethodYouWantToMock')
            ->withAnyParameters()
            ->willReturn($yourReturnValue);
于 2020-08-13T12:37:18.830 回答