PHPUnit - 如何在另一个类的方法中模拟该类?

lau*_*kok 4 phpunit unit-testing mocking

如何在另一个类的方法中模拟该类?

例如,

protected function buildRequest($params)
{
    return new \Request();
}

public function getPayload($params)
{
    $request = $this->buildRequest($params);
    ....
}
Run Code Online (Sandbox Code Playgroud)

我可以嘲笑吗buildRequest

我需要测试这个方法getPayload($params),但出现以下错误:

Class 'Request' not found in...
Run Code Online (Sandbox Code Playgroud)

Jak*_*las 5

一种选择是引入一个可以创建Request实例的工厂,并将该工厂注入到您的类中。你可以存根工厂和它创建的任何东西。

另一种选择是扩展您正在测试的类,重写您的buildRequest()方法以返回模拟并通过此扩展测试您的类。

最后,PHPUnit 为您提供了创建所谓的部分模拟的能力:

$request = new \Request();
$params = [1, 2, 3];

$foo = $this->getMock(Foo::class, ['buildRequest']);
$foo->expects($this->any())
    ->method('buildRequest')
    ->with($this->equalTo($params))
    ->willReturn($request);

$payload = $foo->getPayload($params);
Run Code Online (Sandbox Code Playgroud)

但是,您的Request课程似乎不存在或不自动加载。您需要首先解决这个问题。