myo*_*yol 6 testing mocking laravel
我在我的应用程序中使用Laravel 合约来将应用程序代码与框架代码分离。但主要是,我发现一目了然更容易看出班级做得太多——我们的遗留项目受到到处都是“隐藏的外观”的影响。
use Illuminate\Console\Command;
use Illuminate\Contracts\Filesystem\Factory as File;
class MyClass extends Command
{
public function __construct(File $file)
{
$this->file = $file;
}
public function handle()
{
$this->file->put('/here.txt', 'stuff');
}
}
Run Code Online (Sandbox Code Playgroud)
当试图模拟它们时,问题就来了。如果我模拟合同并运行测试,则不会使用模拟代替合同。
use Illuminate\Contracts\Filesystem\Factory as File
MyClassTest
{
public function my_example_test()
{
$fileSystem = m::mock(File::class);
$fileSystem->shouldReceive('put')->once();
$this->app->instance(File::class, $fileSystem);
$this->artisan('my-custom-command');
}
}
Run Code Online (Sandbox Code Playgroud)
当我检查$file属性时,我当然可以看到 laravel 使用了具体的实现(显然)。除了当我尝试模拟具体实现时,它也被用来代替模拟。
use Illuminate\Config\Repository as File;
MyClassTest
{
public function my_example_test()
{
$fileSystem = m::mock(File::class);
$fileSystem->shouldReceive('put')->once();
$this->app->instance(File::class, $fileSystem);
$this->artisan('my-custom-command');
}
}
Run Code Online (Sandbox Code Playgroud)
我尝试嘲笑两者,但这也不起作用。我正在做集成测试,因此为什么我使用 artisan 调用命令。显然,单元测试有一种稍微简单的方法,但这对我的情况没有帮助。
我应该注意,使用上述模拟我自己的类的方法非常有效,并且 Laravel 容器将模拟注入到相应的类中。它也适用于底层的外观类- 只是不适用于契约。
我也尝试了以下方法也没有成功。
MyClassTest
{
public function my_example_test()
{
$fileSystem = m::mock(File::class);
$fileSystem->shouldReceive('put')->once();
$this->app->bind(File::class, $fileSystem);
$this->artisan('my-custom-command');
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:好的,当模拟Illuminate\Console\Command类注入到扩展 laravel类的任何类的构造函数中时,这似乎是一个问题。注入到 handle 方法中的模拟类工作得很好。
| 归档时间: |
|
| 查看次数: |
301 次 |
| 最近记录: |