2017-05-22 85 views
0

不PHPUnit的不允許我根據傳入的參數指定返回值下面給出一個500錯誤:PHPUnit的改變基於參數模擬方法的返回值

//模擬會話值

$container->get('session') 
    ->method('get') 
    ->with(SESSION_FILTER_MONTH) 
    ->willReturn('2017-05'); 
$container->get('session') 
    ->method('get') 
    ->with(SESSION_FILTER_FUND) 
    ->willReturn(1); 

在我的應用程序,以下行拋出該異常:

$fundId = $container->get('session')->get(SESSION_FILTER_MONTH); // works OK 
$fundId = $container->get('session')->get(SESSION_FILTER_FUND); // breaks: should return 1 in my tests 

但是,如果我只有一個方法模擬聲明,如:

// $container->get('session') 
//  ->method('get') 
//  ->with(SESSION_FILTER_MONTH) 
//  ->willReturn('test_return'); 
$container->get('session') 
    ->method('get') 
    ->with(SESSION_FILTER_FUND) 
    ->willReturn('test_return_fund'); 

//... 

// $fundId = $container->get('session')->get(SESSION_FILTER_MONTH); 
$fundId = $container->get('session')->get(SESSION_FILTER_FUND); // works this time! 

...然後它工作正常。似乎它只需要一個單一的方法模擬聲明,即使我提供了與()方法不同的參數 - 我希望返回值根據不同而有所不同。

我並沒有真正從控制檯獲得太多信息,它只是告訴我Failed asserting that 500 matches expected 302.沒有異常消息。我甚至嘗試在try..catch塊中包裝代碼,但不會更改輸出。

回答

1

您可以使用returnValueMap更改您的模擬所返回的值。

https://phpunit.de/manual/current/en/test-doubles.html#test-doubles.stubs.examples.StubTest5.php

此方法採用的陣列,其中所述第一n個值是所使用的參數和的最後一個值是返回值。

所以,你的模擬是這樣的:

$map = [ 
    [ SESSION_FILTER_MONTH, '2017-05'], 
    [ SESSION_FILTER_FUND, 'test_return_fund'] 
]; 

$container->get('session') 
    ->method('get') 
    ->will($this->returnValueMap($map)); 
+0

謝謝,這讓我在正確的軌道上。最初我得到了NULL,但是我猜'get'方法有第二個參數,它帶有一個我不知道的默認值。所以我改成了'[SESSION_FILTER_MONTH,null,'return_value'],' - 只是想提一下其他人在沒有意識到的情況下犯了類似的錯誤。現在工作:) – Martyn