如何在Laravel 5.4中使用ask()测试Artisan命令
尝试使用ask()函数为laravel php artisan命令编写测试。我以前从未使用过嘲弄,但当我尝试运行测试时,它会冻结,所以我猜,我做错了什么 MyCommand.php:如何在Laravel 5.4中使用ask()测试Artisan命令,laravel,laravel-5,phpunit,mockery,Laravel,Laravel 5,Phpunit,Mockery,尝试使用ask()函数为laravel php artisan命令编写测试。我以前从未使用过嘲弄,但当我尝试运行测试时,它会冻结,所以我猜,我做错了什么 MyCommand.php: public function handle() { $input['answer1'] = $this->ask('Ask question 1'); $input['answer2'] = $this->ask('Ask question 2');
public function handle()
{
$input['answer1'] = $this->ask('Ask question 1');
$input['answer2'] = $this->ask('Ask question 2');
$input['answer3'] = $this->ask('Ask question 3');
//--- processing validation
$validator = Validator::make($input, [
'answer1' => 'required',
'answer2' => 'required',
'answer3' => 'required',
]);
if ($validator->fails()) {
// processing error
}
} else {
// saving to DB
}
}
以及我的单元测试:
$command = m::mock('\App\Console\Commands\Questions');
$command->shouldReceive('ask')
->andReturn('Answer 1')
->shouldReceive('ask')
->andReturn('Answer 2')
->shouldReceive('ask')
->andReturn('Answer 3')
$this->artisan('myCommand:toRun');
$this->assertDatabaseHas('myTable', [
'question1' => 'answer1'
]);
Laravel 5.4-5.6 这里的实际问题是运行console命令正在等待用户输入,但是我们通过PHPUnit运行它,因此无法输入任何内容 在单元测试中遇到限制最初可能会令人沮丧,然而,您发现的限制最终可能会变相成为一种幸事 目前,您的实现与视图(一个控制台命令,因此是管理员的视图,但仍然是视图)紧密耦合。这里可以做的是将任何逻辑放在一个单独的类中,
MyCommand
可以利用,PHPUnit可以自己实际测试。我们知道运行自定义命令的基本原理是有效的,如Laravel单元测试所示,因此我们可以在一个单独的、可测试的类中卸载我们的逻辑
您的新类可能如下所示:
class CommandLogic
{
public function getQuestion1Text()
{
return 'Ask question 1';
}
public function getQuestion2Text()
{
return 'Ask question 2';
}
public function getQuestion3Text()
{
return 'Ask question 3';
}
public function submit(array $input)
{
$validator = \Illuminate\Support\Facades\Validator::make($input, [
'answer1' => 'required',
'answer2' => 'required',
'answer3' => 'required',
]);
if ($validator->fails()) {
// processing error
} else {
// saving to DB
}
}
}
$commandLogic = new CommandLogic();
$sampleInput = [
'answer1' => 'test1',
'answer2' => 'test2',
'answer3' => 'test3',
];
$commandLogic->submit($sampleInput);
$this->assertDatabaseHas('myTable', [
'question1' => 'test1'
]);
public function handle()
{
$commandLogic = new CommandLogic();
$input['answer1'] = $this->ask($commandLogic->getQuestion1Text());
$input['answer2'] = $this->ask($commandLogic->getQuestion2Text());
$input['answer3'] = $this->ask($commandLogic->getQuestion3Text());
$commandLogic->submit($input);
}
…您的实际单元测试,类似以下内容:
class CommandLogic
{
public function getQuestion1Text()
{
return 'Ask question 1';
}
public function getQuestion2Text()
{
return 'Ask question 2';
}
public function getQuestion3Text()
{
return 'Ask question 3';
}
public function submit(array $input)
{
$validator = \Illuminate\Support\Facades\Validator::make($input, [
'answer1' => 'required',
'answer2' => 'required',
'answer3' => 'required',
]);
if ($validator->fails()) {
// processing error
} else {
// saving to DB
}
}
}
$commandLogic = new CommandLogic();
$sampleInput = [
'answer1' => 'test1',
'answer2' => 'test2',
'answer3' => 'test3',
];
$commandLogic->submit($sampleInput);
$this->assertDatabaseHas('myTable', [
'question1' => 'test1'
]);
public function handle()
{
$commandLogic = new CommandLogic();
$input['answer1'] = $this->ask($commandLogic->getQuestion1Text());
$input['answer2'] = $this->ask($commandLogic->getQuestion2Text());
$input['answer3'] = $this->ask($commandLogic->getQuestion3Text());
$commandLogic->submit($input);
}
…和您的控制台命令,类似于:
class CommandLogic
{
public function getQuestion1Text()
{
return 'Ask question 1';
}
public function getQuestion2Text()
{
return 'Ask question 2';
}
public function getQuestion3Text()
{
return 'Ask question 3';
}
public function submit(array $input)
{
$validator = \Illuminate\Support\Facades\Validator::make($input, [
'answer1' => 'required',
'answer2' => 'required',
'answer3' => 'required',
]);
if ($validator->fails()) {
// processing error
} else {
// saving to DB
}
}
}
$commandLogic = new CommandLogic();
$sampleInput = [
'answer1' => 'test1',
'answer2' => 'test2',
'answer3' => 'test3',
];
$commandLogic->submit($sampleInput);
$this->assertDatabaseHas('myTable', [
'question1' => 'test1'
]);
public function handle()
{
$commandLogic = new CommandLogic();
$input['answer1'] = $this->ask($commandLogic->getQuestion1Text());
$input['answer2'] = $this->ask($commandLogic->getQuestion2Text());
$input['answer3'] = $this->ask($commandLogic->getQuestion3Text());
$commandLogic->submit($input);
}
这将强制并分离代码库中的移动片段。我知道这可能会让人觉得有点逃避责任,但在Laravel5.4中测试这种东西是很困难的。如果您愿意升级到5.7或更高版本,请阅读下面的
Laravel 5.7+ Laravel5.7引入了能够运行控制台测试的功能,这满足了这个问题的确切要求-。这是一个完整的集成测试,而不是单元测试