Mockery - 使用构造函数数据创建模拟

Mockery - creating mock with constructor data

我正在尝试使用 Laravel 的应用服务容器来解析模拟实例以进行测试。我创建了一个 mock,它在单独创建 CS_REST_Subscribers 实例时有效,但是如果我向服务容器提供参数,我的 mock 将不再适用。

$this->mock(\CS_REST_Subscribers::class, function (MockInterface $mockery) {
    $mockery
        ->shouldReceive('add')
        ->once();
});
get_class(app()->make(\CS_REST_Subscribers::class)); // returns Mockery_2_CS_REST_Subscribers

get_class(app()->make(\CS_REST_Subscribers::class, [
    'list_id' => 'testing',
    'auth_details' => ['api_token' => '123']
])); // returns CS_REST_Subscribers

转储 1 给我 Mockery_2_CS_REST_Subscribers 但转储 2 给我 CS_REST_Subscribers

知道如何在传递构造函数参数时应用模拟吗?我忍不住觉得我在这里错过了什么......

我刚刚在 Laravel 提出的问题 https://github.com/laravel/framework/issues/19450#issuecomment-451549582

后面找到了解决方案

似乎在传递参数时,Laravel 的内置模拟绕过构建模拟实例。

解决方案是创建我的 Mockery mock,然后将其直接绑定到服务容器,从而强制 Laravel 解析服务容器中提供的内容。

$mock = \Mockery::mock(\CS_REST_Subscribers::class)->makePartial();
$mock->shouldReceive('add')->once();
$this->app->bind(\CS_REST_Subscribers::class, fn() => $mock);