2016-08-28 1 views
1

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

ここでの問題は、それが難しいのテストを書くことができた、コンソールのサイズに応じて、私の出力は、1本のまたは2つのライン上に表示することができるということです異なる環境で実行することができます。

は、私の環境では例えば、それはこのように表示されます:このような

output in my computer

とでトラヴィス:

output on travis

ブレーキのテスト。

コンポーネントがこのケースの回避策を提供しているかどうか知っていますか?

+0

最初の場所でのテスト方法を実際に理解しているので、「端末の幅が異なる場合にコンソールコマンド出力をテストするにはどうすればよいですか? – cilefen

+0

こんにちはジョナグ。 @cilefenの答えは実際にあなたの質問に答えましたか?それともあなたはまだ助けが必要ですか? –

+0

@ cilefenの答えは、コマンドの動作を変更することを意味しているので、誰かがアイディアを持っていれば、より良い解決策を探しています。 – Jonag

答えて

0

最後に、テスト用の端子サイズの修正方法を考え出しました。

symfony/consoleでは、v3.2以降、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'); 
} 

とテストがトラヴィスに、私のローカル環境で緑色です:):

私のテストは今です。

0

wordwrap関数を使用して、すべての出力を75列に制限します。

$output->writeln(wordwrap($long_string)); 
+0

はい、私は大丈夫ですが、端末のサイズが許せば、出力は1行に表示されます... – Jonag

関連する問題