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

标签 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...

最佳答案

一个选择是引入一个工厂来创建一个Request 实例,并将该工厂注入(inject)到您的类中。您将能够 stub 工厂及其创建的任何内容。

另一种选择是扩展您正在测试的类,覆盖您的 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 类似乎不存在或无法自动加载。你需要先解决这个问题。

关于unit-testing - PHPUnit - 如何在另一个类的方法中模拟该类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35334068/

相关文章:

python - Pytest - 将多个 fixture 参数组合到一个 fixture 中以优化 fixture 实例化

laravel - 在运行 laravel phpunit testcase 时,我在 Model.php 第 1249 行收到错误 "Call to a member function connection() on null"

symfony - Silex 网络测试用例 : Cannot send session cookie headers already sent by PHPUnit/Util/Printer

ios - 使用单元测试时遇到问题

c# - 具有只读 Prop 和内部构造函数的返回类型的模拟第三方接口(interface)

python - 如何在我想要导入的模块中模拟一些功能?

python - 如何在单元测试期间验证 Mock mock_calls 列表中的 .__getitem__() 调用

php - 如何在 PHP 单元测试中模拟在构造函数中调用的方法?

php - 不要在 Netbeans 中测试从 Yii 扩展的类的组(PHPUnit 支持@group 注释)功能

java - 我测试正确吗?