【问题标题】:Mockery - creating mock with constructor dataMockery - 使用构造函数数据创建模拟
【发布时间】:2021-12-01 22:20:54
【问题描述】:

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

$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 mocking mockery


    【解决方案1】:

    我刚刚在 Laravel 提出的问题 https://github.com/laravel/framework/issues/19450#issuecomment-451549582 后面找到了解决方案

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-10
      • 2015-08-15
      • 2011-02-27
      • 1970-01-01
      • 2016-08-11
      • 2016-04-22
      • 1970-01-01
      • 2019-11-24
      • 2013-01-12
      相关资源
      最近更新 更多