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);
我正在尝试使用 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);