Laravel 5.8与参数,DI和模拟无效的上下文结合



上下文绑定

$this->app->when(ImportCommand::class)
->needs(Foo::class)
->give(function() {
   return new Foo(env('IMPORT_BAR'));
});

进口工具类构造函数的依赖注入

这很好:

public function __construct(Foo $foo) {
   // Foo with the argument is now injected
}

用于测试类ImportCommand,我需要模拟

我想在我的进口测试类中嘲笑foo,但这不起作用。

   $this->mock(Foo::class, function ($mock) {
      $mock->shouldReceive([
         'login' => true,
         'get' => true,
         'rename' => true,
      ]);
   });
   $this->artisan('foo:bar');

呼叫工匠命令,将使用真实的foo类代替模拟。我该如何解决?

遇到相同的问题并尝试一些事情后,我发现容器extend()方法最有效。


$this->app->extend(Foo::class, function () {
    return Mockery::mock(Foo::class, function($mock) {
        $mock->shouldReceive([...]);
    });
});

我尝试过的其他事情,失败了

  • Container.afterResolve()
  • Container.bind()
  • TestCase.swap()
  • TestCase.instance()

您应该能够上下文绑定它,从我的角度看不清楚它如何模拟它,但是假设您可以使用Mockery或类似的模拟实例,您可以绑定该实例,使用addContextualBinding方法。实例需要包裹在closure中并返回。

$mockedInstance = something();
$this->app->addContextualBinding(
    ImportCommand::class,
    Foo::class,
    function() use($mockedInstance) {
        return $mockedInstance;
    }
);

最新更新