2017-01-09 7 views
0

test1で呼び出されたときgetメソッドを嘲笑して、123を返すクラスがあります。これは正常に動作します。 メソッドは、通常返されるものを返します。つまり、特定のパラメータを持つ呼び出しのみが模擬応答を返します。私はエラーを取得するつまり$config->get('test2')コード内の異なるパラメータを取得呼び出すもしそうなら特定のパラメータの応答のみを擬似します

$configMock = m::mock(Config::class); 

$configMock->shouldReceive('get') 
     ->with('test1') 
     ->andReturn(123); 

嘲笑\例外の\ NoMatchingExpectationException:一致するハンドラがMockery_1_Illuminate_Contracts_Config_Repository見つかりません::取得(「TEST2」 )。どちらの方法は、予想外であったか、私は私がエラーに取得する行$config->get('test2')で、最初の行に->makePartial()を使用する場合、その引数は

しかし、この方法のために何も期待される引数リストに一致しない

BadMethodCallException:方法Mockery_1_Illuminate_Contracts_Config_Repository :: get()がこのモックオブジェクトに存在しません

メソッドのレスポンスをマスクして、そのメソッドをretそのメソッドへの他のすべての呼び出しに対して通常の応答を返しますか?

答えて

0

私は@Loeksアドバイスを取った。これを行うクリーナーの方法があるかもしれないが、これは私のために働いています。

$config = new Config; 

    $closure = function ($arg) use ($config) { 
     switch ($arg) { 
      case 'test1': 

       return 123; 
      default: 
       // Return default values 

       return $config->get($arg); 
     } 
    }; 

    $configMock = m::mock(Config::class) 
     ->makePartial(); 

    $configMock->shouldReceive('get') 
     ->andReturnUsing($closure); 
1

個人的には、すべてのテスト機能で何が起こりたいのかを正確に指定する必要があります。だから、基本的には次のようになります。

$configMock->shouldReceive('get') 
      ->with('test2') 
      ->andReturn(INSERT_CORRECT_RESPONSE); 

注あなたはこれをやってテスト機能の多くを持っている場合、これはかなりのコードの重複につながるので、あなたは別の方法にそれを抽出するかもしれないこと:

private function testCorrectResult($parameter) 
{ 
    $configMock = m::mock(Config::class); 

    if ($parameter === 'test1') { 
     $configMock->shouldReceive('get') 
        ->with('test1') 
        ->andReturn(123); 
    } else { 
     $configMock->shouldReceive('get') 
        ->with('test2') 
        ->andReturn(INSERT_CORRECT_RESPONSE); 
    } 
} 

これは私があなたの質問があったと信じていることです、私が間違っていたら教えてください!

+0

おかげで、私は、このメソッドからのすべての単一の応答、特定のパラメータが渡された1つだけ模擬したくありません。 – myol

+0

パラメータを持っていればそれを模倣し、それ以外の場合は普通に呼び出します。 – Loek

+0

はい、嘲笑を使って可能ですか?私はPHPUnitを使用してそれをしていることはほとんど確信しています – myol

関連する問題