包含模拟对象的 Laravel PHPunit 测试不会修改服务提供者

问题描述 投票:0回答:1

我有一个 Laravel 站点,其中包含一个名为

Importer
的模型对象,它扩展了

Illuminate\Database\Eloquent\Model  

它有一个

__construct
函数,接受
$name
$type
变量。它还具有一个名为
get_data()
的函数,该函数调用外部 API 并返回 SimpleXML 对象或 null。它涉及一个我想测试的复杂过程。在测试过程中,我想模拟这个对象,以便在调用
get_data()
时可以阻止外部 API 调用并返回可测试的数据。在我的测试中,我包含了以下代码:

$this->mock(Importer::class, function ($mock) {
        $mock->shouldReceive('get_data')->once()->andReturn(null);
});

我希望在测试期间在另一个对象的函数中执行以下代码时模拟返回 null:

$import_object = new Importer('Weather', 'Temperature');
$result = $import_object->get_data();

但是,我发现原来的 Importer 函数仍在被调用。为什么模拟不起作用?

php laravel mocking phpunit service-provider
1个回答
0
投票

只能通过服务容器进行模拟。

在 Laravel 中避免使用

new

$import_object = app(Importer::class, ['name' => 'Weather', 'type' => 'Temperature']);

通过这种用法,可以进行模拟。

最好避免 Model 继承和覆盖 __construct()。

© www.soinside.com 2019 - 2024. All rights reserved.