sch*_*rht 5 command unit-testing laravel laravel-artisan
我想测试我的 Laravel Artisan 命令。所以我需要模拟一个对象并存根这个模拟对象的方法。在我的测试中,我无法使用真实的SFTP环境。
这是handle()我的命令:
public function handle()
{
$sftp = new SFTP('my.sftpenv.com');
$sftp->login('foo', 'bar');
}
Run Code Online (Sandbox Code Playgroud)
我想在测试中模拟 SFTP:
$sftp = $this->createMock(SFTP::class);
$sftp->expects($this->any())->method('login')->with('foo', 'bar');
$this->artisan('import:foo');
Run Code Online (Sandbox Code Playgroud)
运行测试结果在 a 中Cannot connect to ...:22,它来自login的原始方法SFTP。所以mock/stub不生效。
所以我的问题是:如何在 Laravel Artisan 命令测试中模拟对象?
我认为@Mesuti 的意思是,如果您将对象绑定SFTP到服务容器,则可以在运行测试时将其与模拟对象交换。
您可以像这样绑定它(在您的app/Providers/AppServiceProvider.php或新的服务提供商内部):
$this->app->singleton(SFTP::class, function ($app) {
return new SFTP('my.sftpenv.com');
});
Run Code Online (Sandbox Code Playgroud)
然后,您可以解析命令处理程序中的对象(例如$sftp = resolve('SFTP');),然后在测试中模拟它,如下所示:
$this->mock(SFTP::class, function ($mock) {
$mock->expects()->login('foo', 'bar')->andReturn('whatever you want it to return');
});
Run Code Online (Sandbox Code Playgroud)
请注意未来的读者,您正在嘲笑的服务应该在handle命令的方法中解决,而不是__construct像在其他情况下经常做的那样在方法中解决。似乎 artisan 命令在运行测试之前就已解析,因此如果您在命令的构造函数中解析服务,它不会解析为模拟实例。
| 归档时间: |
|
| 查看次数: |
1317 次 |
| 最近记录: |