我正在玩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:
制动测试。
您知道该组件是否为此案例提供了解决方法吗?
答案 0 :(得分:0)
使用wordwrap函数将所有输出约束为75个左右。
$output->writeln(wordwrap($long_string));
答案 1 :(得分:0)
我终于想出了如何修复测试的终端大小。
从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和我的本地环境中测试是绿色的:)。