终端宽度不同时如何测试控制台命令输出?

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 和我的本地环境中测试是绿色的:)。