我正在将我的Laravel 4.2应用程序迁移到5.1(从5.0开始),并且我的控制台命令单元测试很麻烦.我有工匠命令,我需要测试生成的控制台输出,正确的问题/响应处理以及与其他服务的交互(使用模拟).尽管如此,Laravel文档在测试控制台命令方面仍然是无声的.
我终于找到了一种创建这些测试的方法,但感觉就像是对那些setLaravel和setApplication调用的黑客攻击.
有一个更好的方法吗?我希望我可以将我的模拟实例添加到Laravel IoC容器中,并让它创建命令以测试所有正确设置的内容.我担心我的单元测试会在较新的Laravel版本中轻松破解.
这是我的单元测试:
使用陈述:
use Mockery as m;
use App\Console\Commands\AddClientCommand;
use Symfony\Component\Console\Tester\CommandTester;
Run Code Online (Sandbox Code Playgroud)
建立
public function setUp() {
parent::setUp();
$this->store = m::mock('App\Services\Store');
$this->command = new AddClientCommand($this->store);
// Taken from laravel/framework artisan command unit tests
// (e.g. tests/Database/DatabaseMigrationRollbackCommandTest.php)
$this->command->setLaravel($this->app->make('Illuminate\Contracts\Foundation\Application'));
// Required to provide input to command questions (provides command->getHelper())
// Taken from ??? when I first built my command tests in Laravel 4.2
$this->command->setApplication($this->app->make('Symfony\Component\Console\Application'));
}
Run Code Online (Sandbox Code Playgroud)
输入作为命令参数提供.检查控制台输出
public function testReadCommandOutput() {
$commandTester = new CommandTester($this->command);
$result …Run Code Online (Sandbox Code Playgroud) 测试Laravel控制台命令的最佳方法是什么?
这是我正在运行的命令的示例。它在构造函数和handle方法中接受一个值。
class DoSomething extends Command
{
protected $signature = 'app:do-something';
protected $description = 'Does something';
public function __construct(A $a)
{
...
}
public function handle(B $b)
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
在测试类中,我可以模拟A和B,但是我不知道如何传入$ a。
$this->artisan('app:do-something', [$b]);
Run Code Online (Sandbox Code Playgroud)
可能吗?还是我要解决所有这些错误?我是否应该将所有事情都传递给handle()方法?
谢谢。