2017-01-09 64 views
0

我有一个类,我嘲笑get方法时调用test1返回123。这工作正常。嘲笑只对某个参数

但是,我希望所有其他调用get方法返回通常会返回的内容 - 即只有具有特定参数的调用返回模拟响应。

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

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

所以,如果我打电话与代码中不同的参数得到即$config->get('test2')我得到的错误

嘲弄\异常\ NoMatchingExpectationException:不匹配的处理器找到Mockery_1_Illuminate_Contracts_Config_Repository ::获得(“测试2” )。无论哪种方法是意外或它的参数此方法匹配没有预期的参数列表

然而,当我在第一行使用->makePartial(),在该行$config->get('test2')我得到的错误

BadMethodCallException:方法Mockery_1_Illuminate_Contracts_Config_Repository :: get()在这个模拟对象上不存在

如何在只允许某个参数传递方法响应的同时让该方法返回瓮对该方法的所有其他调用的正常响应?

回答

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

谢谢,但我不想嘲笑此方法的每一个反应,当达到一定参数传递只有一个。 – myol

+0

那么如果你有参数并且在正常情况下调用它,那么模拟该方法呢? – Loek

+0

是的,这有可能使用嘲弄吗?我几乎可以肯定,我已经使用PHPUnit – myol