终端宽度不同时如何测试控制台命令输出?
How to test console command output when terminal widths differ?
我正在玩 Symfony 的控制台组件,但在测试时遇到了问题。
我有一个命令可以移动一些文件并根据执行的操作显示消息。我正在使用 SymfonyStyle 来格式化我的输出。
我正在使用 CommandTester 来测试我的命令,但是如果我能够测试该命令是否执行了某些操作,我就找不到测试其输出的有效方法。
这是我正在尝试做的事情:
<?php
public function testIgnoreSamples()
{
$container = $this->application->getContainer();
$container['config'] = [
'source_directory' => vfsStream::url('Episodes/From'),
'target_directory' => vfsStream::url('Episodes/To'),
'ignore_if_nuked' => false,
'delete_nuked' => false,
'search_subtitles' => false,
'prefer_move_over_copy' => false
];
copy(
__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Fixtures/breakdance.mp4',
vfsStream::url('Episodes/From/sample-angie.tribeca.s01e07.720p.hdtv.x264-killers.mkv')
);
$commandTester = new CommandTester($this->application->find('episodes:move'));
$commandTester->execute([]);
$this->assertContains('because it\'s a sample', $commandTester->getDisplay());
$this->assertEquals([], vfsStream::inspect(new vfsStreamStructureVisitor())->getStructure()['Episodes']['To'], 'Target directory is empty');
}
这里的问题是,根据控制台的大小,我的输出可以显示在一两行上,这使得编写可以在不同环境中执行的测试变得困难。
例如在我的环境中它是这样显示的:
在 travis 中是这样的:
这会阻止测试。
您知道该组件是否为这种情况提供了解决方法吗?
使用 wordwrap 函数将所有输出限制在 75 列左右。
$output->writeln(wordwrap($long_string));
我终于想出了如何修复测试的终端大小。
从 v3.2 开始,symfony/console 允许我们固定终端大小,SymfonyStyle 使用它来构建输出。
只需在执行命令之前调用 putenv('COLUMNS=80')
来固定其终端大小。
我的测试现在是:
public function testIgnoreSamples()
{
$container = $this->application->getContainer();
$container['config'] = [
'source_directory' => vfsStream::url('Episodes/From'),
'target_directory' => vfsStream::url('Episodes/To'),
'ignore_if_nuked' => false,
'delete_nuked' => false,
'search_subtitles' => false,
'prefer_move_over_copy' => false
];
copy(
__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Fixtures/breakdance.mp4',
vfsStream::url('Episodes/From/sample-angie.tribeca.s01e07.720p.hdtv.x264-killers.mkv')
);
putenv('COLUMNS=80');
$commandTester = new CommandTester($this->application->find('episodes:move'));
$commandTester->execute([]);
$expected = <<<'EXPECTED'
! [NOTE] File sample-angie.tribeca.s01e07.720p.hdtv.x264-killers.mkv ignored
! because it's a sample
EXPECTED;
$this->assertContains($expected, $commandTester->getDisplay());
$this->assertEquals([], vfsStream::inspect(new vfsStreamStructureVisitor())->getStructure()['Episodes']['To'], 'Target directory is empty');
}
并且在 travis 和我的本地环境中测试是绿色的:)。
我正在玩 Symfony 的控制台组件,但在测试时遇到了问题。
我有一个命令可以移动一些文件并根据执行的操作显示消息。我正在使用 SymfonyStyle 来格式化我的输出。
我正在使用 CommandTester 来测试我的命令,但是如果我能够测试该命令是否执行了某些操作,我就找不到测试其输出的有效方法。
这是我正在尝试做的事情:
<?php
public function testIgnoreSamples()
{
$container = $this->application->getContainer();
$container['config'] = [
'source_directory' => vfsStream::url('Episodes/From'),
'target_directory' => vfsStream::url('Episodes/To'),
'ignore_if_nuked' => false,
'delete_nuked' => false,
'search_subtitles' => false,
'prefer_move_over_copy' => false
];
copy(
__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Fixtures/breakdance.mp4',
vfsStream::url('Episodes/From/sample-angie.tribeca.s01e07.720p.hdtv.x264-killers.mkv')
);
$commandTester = new CommandTester($this->application->find('episodes:move'));
$commandTester->execute([]);
$this->assertContains('because it\'s a sample', $commandTester->getDisplay());
$this->assertEquals([], vfsStream::inspect(new vfsStreamStructureVisitor())->getStructure()['Episodes']['To'], 'Target directory is empty');
}
这里的问题是,根据控制台的大小,我的输出可以显示在一两行上,这使得编写可以在不同环境中执行的测试变得困难。
例如在我的环境中它是这样显示的:
在 travis 中是这样的:
这会阻止测试。
您知道该组件是否为这种情况提供了解决方法吗?
使用 wordwrap 函数将所有输出限制在 75 列左右。
$output->writeln(wordwrap($long_string));
我终于想出了如何修复测试的终端大小。
从 v3.2 开始,symfony/console 允许我们固定终端大小,SymfonyStyle 使用它来构建输出。
只需在执行命令之前调用 putenv('COLUMNS=80')
来固定其终端大小。
我的测试现在是:
public function testIgnoreSamples()
{
$container = $this->application->getContainer();
$container['config'] = [
'source_directory' => vfsStream::url('Episodes/From'),
'target_directory' => vfsStream::url('Episodes/To'),
'ignore_if_nuked' => false,
'delete_nuked' => false,
'search_subtitles' => false,
'prefer_move_over_copy' => false
];
copy(
__DIR__.DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR.'Fixtures/breakdance.mp4',
vfsStream::url('Episodes/From/sample-angie.tribeca.s01e07.720p.hdtv.x264-killers.mkv')
);
putenv('COLUMNS=80');
$commandTester = new CommandTester($this->application->find('episodes:move'));
$commandTester->execute([]);
$expected = <<<'EXPECTED'
! [NOTE] File sample-angie.tribeca.s01e07.720p.hdtv.x264-killers.mkv ignored
! because it's a sample
EXPECTED;
$this->assertContains($expected, $commandTester->getDisplay());
$this->assertEquals([], vfsStream::inspect(new vfsStreamStructureVisitor())->getStructure()['Episodes']['To'], 'Target directory is empty');
}
并且在 travis 和我的本地环境中测试是绿色的:)。