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

4

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

例如,

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

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

我可以模拟buildRequest吗?

我需要测试这个方法getPayload($params),但是我遇到了这个错误:

Class 'Request' not found in...
1个回答

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);

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接