上下文绑定
$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;
}
);