1

当抛出异常时,我一直在尝试使用 Mockery 断言从另一个方法中调用一个方法。举个例子:

public function testOtherMethodIsCalled() {

    $client = m::mock('Client');
    $client
        ->shouldReceive('getFoo')
        ->andThrow(new FooNotAvailableException);

    $controller = m::mock('Controller[otherMethod]');
    $controller
        ->shouldReceive('otherMethod')
        ->once();

    $controller->setClient($client);
    $controller->firstMethod();
}

显然,名称已被简化,但这与我所拥有的所有其他方式相同。在代码中,当FooNotAvailableException被捕获时,我将调用返回给otherMethod().

问题是当运行它时,我得到这个错误:

Mockery\CountValidator\Exception:Controller 中的方法 otherMethod() 应该准确调用 1 次,但调用 0 次。

那是因为在内部otherMethod()调用了原始的、未模拟的。如果我要从测试中调用它,如下所示:

$controller->otherMethod();

测试通过。

为什么会这样,我将如何为我想要测试的内容编写测试?

4

1 回答 1

0

没有完整的代码源很难说,但我相信这就是正在发生的事情:

你的代码:

$client = m::mock('Client');
$client
    ->shouldReceive('getFoo')
    ->andThrow(new FooNotAvailableException);

到目前为止,一切都很好。还没有问题。

$controller = m::mock('Controller[otherMethod]');
$controller
    ->shouldReceive('otherMethod')
    ->once();

$controller->setClient($client);
$controller->firstMethod();

现在,我们遇到了一个问题。我假设被测代码正在重定向到另一个 URL。发生这种情况时,您将实例化另一个控制器。您实例化的控制器不会是由“m::mock('Controller[otherMethod]')”实例化的控制器。因此,显然模拟实例永远不会收到“otherMethod”。

根据您的被测代码的实际编写方式,测试它的正确方法可能是断言已从处理 FooNotAvailableException 的函数调用了 Redirect::to。

于 2014-02-28T20:09:18.350 回答