2016-07-29 3 views
0

私はテストを学習しており、「early returns」を使用して関数をテストしようとしています。成功の関数は別のクラスのプロパティを設定し、失敗した場合は単に両方の場合に戻り値が返されます。この例では早期返品(防御プログラミング)に対するテスト

class Test 
{ 
    private $fileHandler; 
    private $config; 

    public __constructor($fileHandler, $config) 
    { 
     $this->fileHandler = $fileHandler; 
     $this->config = $config; 
    } 

    public function example($filePath) 
    { 
     $exists = $this->fileHandler->exists($filePath); 

     if ($exists === false) { 
      return; 
     } 

     $this->config->set($filePath); 
    } 
} 

Iは Iは、2回のユニットテストで及びfileHandlerクラスをモックすることによってこれをテストすることができると信じ

失敗(早期復帰)の場合は、$configクラスのメソッドset()を呼び出すべきではありませんが、成功のためにメソッドを呼び出す必要があります。

しかし、私が試してみるとnever()からonce()に変更するとこのテストに合格し、テスト全体が偽であると思うようになります。

/** test */ 
public function config_is_not_set_with_missing_file() 
{ 
    $fileHandlerMock = $this->getMockBuilder(fileHandler::class)->getMock; 
    $fileHandlerMock->method('exists') 
     ->willReturn('false'); 
    $configMock = $this->getMockBuilder(config::class)->getMock; 

    $test = new Test($fileHandlerMock, $configMock); 
    $test->example('fake file path'); 

    $configMock->expects($this->never()) 
     ->method('set'); 
} 
+0

その理由がわからないのですが、 '$ test-> example()'文を実行する前にモックを設定する必要があります – gontrollez

+0

注意! '' false '!== false'!あなたの模擬関数は、内容が "false"で、ブール値* false *ではない文字列を返します。 – helmbert

答えて

1

あなたのファイルハンドラモックは、文字列'false'!==false)を返しています。 falseTets::exampleに変更して早めに戻ってください。

1

あなたはTestコンストラクタに$configMockを渡していないので、それが使用されていません。

テストがonceneverの両方の期待値をパスした場合、テストは期待どおりに機能していないため、レビューが必要です。

+0

ありがとう、それはタイプミスでした、私は質問を更新しました – myol

+0

私のコメントで述べたことを試してください: 'example'メソッドを実行する前にモックを設定してください – gontrollez

関連する問題