2016-06-22 12 views
1

ESCAPE(\ 033)などの非印字文字列を出力するコードを記述しています。私は、エスケープ文字なしのPHPUnit expectOutputStringを使用して、それが失敗した場合、それは読みやすい:PHPUnit ExpectOutputStringエラーで読みにくいバイナリ出力が表示される

public function test_output() { 

    echo "foo"; 
    $this->expectOutputString("foob"); 
} 

これは失敗し、私が表示されます:

Failed asserting that two strings are equal. 
Expected :'foob' 
Actual :'foo' 

デバッグが容易な、しかし、私が持っているときエスケープ文字が含ま列:

public function test_escape_output() { 
    echo "\033[0m"; 
    $this->expectOutputString("\033[0mm"); 
} 

を...そして、それが失敗したが、それは私にバイナリ出力を示しています

Failed asserting that two strings are equal. 
Expected :Binary String: 0x1b5b306d6d 
Actual :Binary String: 0x1b5b306d 

文字列が複雑で長くなるようになると、デバッグは難しくなります。

これは、PhpStormへの最近のアップグレードの1つで変更されたようですが、現在は2016.1.2を実行中です。以前は、エラーが表示された場合、エスケープシーケンスを隠すだけで、残りの文字を標準出力に表示するので、 "\ 033 [0m"の場合は "。[0m"(または実際には私が持っている正方形のような文字です)。 "とにかく、私は印刷可能な文字にほとんど興味があったので、デバッグがはるかに簡単でした。この区別が描かれている理由私も明確ではないよ。違ったことを表示する、またはPhpStorm。HELP!

+0

'エコーパック使用してみてください( "H *" と、 "\ 033 [0メートル")' test_escape_output' – CarlosCarucce

+0

@CarlosCarucce 'で - 提案のためのおかげで、残念ながら、PHPUnitのがで応答:)パック(:タイプH :私がエスケープ文字を参照していると思う不正な16進数 – Katie

答えて

0

OKを、いつかこれで騒ぎの後、私はPHPUnitのテストを使用して終了して、この問題を解決するために倍増する。

テストされているクラスでは、私はlエスケープシーケンスを1つのメソッドに変換します。その後、そのメソッドのスタブを作成して、すべてのエスケープ文字をエスケープされた\ eに置き換えて、(文字列全体をバイナリで表示するためにPHPStormをトリガするのではなく)通常の文字になるようにする。

次に、予想される出力を通常の文字列と比較することができ、PHPStormはバイナリではなく通常のテキストで文字列を表示し、デバッグ中の作業を楽にします。

class EscapeStrings { 

    // the method that all output is sent through, so it can be stubbed 
    public function output($text) { 
     echo $text; 
    } 
} 

class testClass extends PHPUnit_Framework_TestCase 
{ 

    // replace the escape character with a printable \\e character 
    public function printableEscape($text) { 
     return str_replace("\e","\\e",$text); 
    } 

    public function testOutput() { 

     // create a mock 
     $stub = $this->createMock(EscapeStrings::class); 

     // switch the output method to call the printable escape method with the $text parameter 
     $stub->method('output') 
      ->will($this->returnCallback([$this,'printableEscape'])); 


     // now can do normal string compare and easier debugging 
     $this->assertEquals("\\e[0mHello", $stub->output("\e[0mHello")); 
    } 

} 
関連する問題