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

时间:2016-08-28 11:05:40

标签: console phpunit symfony

我正在玩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');
}

这里的问题是,根据控制台的大小,我的输出可以显示在一行或两行上,这使得编写可以在不同环境中执行的测试变得很困难。

例如在我的环境中,它显示如下:

output in my computer

并且像这样的travis:

output on travis

制动测试。

您知道该组件是否为此案例提供了解决方法吗?

2 个答案:

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