gpt4 book ai didi

php - Laravel 5 控制台( artisan )命令单元测试

转载 作者:行者123 更新时间:2023-12-01 22:19:29 27 4
gpt4 key购买 nike

我正在将 Laravel 4.2 应用程序迁移到 5.1(从 5.0 开始),并且我的控制台命令单元测试遇到了很多麻烦。我有 artisan 命令,我需要测试生成的控制台输出、正确的问题/响应处理以及与其他服务的交互(使用模拟)。尽管 Laravel 文档有很多优点,但不幸的是,它对测试控制台命令只字不提。

我终于找到了一种创建这些测试的方法,但感觉就像对这些 setLaravelsetApplication 调用进行了黑客攻击。

有更好的方法吗?我希望我可以将我的模拟实例添加到 Laravel IoC 容器中,并让它创建命令来测试正确设置的所有内容。我担心我的单元测试会很容易被较新的 Laravel 版本破坏。

这是我的单元测试:

使用语句:

use Mockery as m;
use App\Console\Commands\AddClientCommand;
use Symfony\Component\Console\Tester\CommandTester;

设置

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'));
}

作为命令参数提供的输入。检查控制台输出

public function testReadCommandOutput() {
$commandTester = new CommandTester($this->command);

$result = $commandTester->execute([
'--client-name' => 'New Client',
]);

$this->assertSame(0, $result);
$templatePath = $this->testTemplate;

// Check console output
$this->assertEquals(1, preg_match('/^Client \'New Client\' was added./m', $commandTester->getDisplay()));
}

通过模拟键盘按键提供输入

public function testAnswerQuestions() {
$commandTester = new CommandTester($this->command);

// Simulate keyboard input in console for new client
$inputs = $this->command->getHelper('question');
$inputs->setInputStream($this->getInputStream("New Client\n"));
$result = $commandTester->execute([]);

$this->assertSame(0, $result);
$templatePath = $this->testTemplate;

// Check console output
$this->assertEquals(1, preg_match('/^Client \'New Client\' was added./m', $commandTester->getDisplay()));
}

protected function getInputStream($input) {
$stream = fopen('php://memory', 'r+', false);
fputs($stream, $input);
rewind($stream);
return $stream;
}

更新

  1. 这在 Laravel 5.1 中不起作用 #11946

最佳答案

我之前已经这样做过,如下 - 我的控制台命令返回一个 json 响应:

public function getConsoleResponse()
{
$kernel = $this->app->make(Illuminate\Contracts\Console\Kernel::class);
$status = $kernel->handle(
$input = new Symfony\Component\Console\Input\ArrayInput([
'command' => 'test:command', // put your command name here
]),
$output = new Symfony\Component\Console\Output\BufferedOutput
);

return json_decode($output->fetch(), true);
}

因此,如果您想将其放入它自己的命令测试器类中,或者作为 TestCase 等中的函数...由您决定。

关于php - Laravel 5 控制台( artisan )命令单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34814954/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com