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

时间:2016-02-11 08:20:57

标签: unit-testing mocking phpunit

如何在另一个班级的方法中模拟课程?

例如,

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

public function getPayload($params)
{
    $request = $this->buildRequest($params);
    ....
}

我可以模仿buildRequest吗?

我需要测试此方法getPayload($params),但我收到此错误:

Class 'Request' not found in...

1 个答案:

答案 0 :(得分:2)

一种选择是引入一个可以创建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);

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