2017-05-22 7 views
0

Does PHPUnit mir nicht erlauben, kehrt Werte auf der Grundlage der übergebenen Argumente in der folgenden gibt einen 500-Fehler angeben.PHPUnit variieren Mock Methode Rückgabewert basierend auf Argumente

// Mock Sitzungswerte

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

In meiner app, wirft die folgende Zeile die Ausnahme:

$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 

Allerdings, wenn ich Mock eine einzige Methode Erklärung nur, wie:

// $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! 

... dann funktioniert es OK. Es scheint, dass es nur eine einzige Methode Scheindeklaration dauert, obwohl ich ein anderes Argument mit mit() -Methode bereitstellen - Ich möchte den Rückgabewert basierend darauf variieren.

Ich bekomme nicht wirklich viel Informationen von der Konsole, es sagt mir nur Failed asserting that 500 matches expected 302. ohne eine Ausnahmebedingung. Ich habe sogar versucht, den Code in try..catch Block zu wickeln, aber ändert nicht die Ausgabe.

Antwort

1

Sie können returnValueMap verwenden, um den Wert zu ändern, der von Ihrem Schein zurückgegeben wird.

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

Dieses Verfahren nimmt ein Array von denen die ersten N-Werte sind die Argumente, verwendet werden und der letzte Wert ist der Rückgabewert.

So würde Ihr Mock wie folgt aussehen:

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

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

Danke, dass Sie mich auf dem richtigen Weg. Ich habe ursprünglich NULLs zurückbekommen, aber ich nehme an, dass die 'get'-Methode ein zweites Argument mit einem Standardwert hat, von dem ich nichts wusste. Also wechselte ich zu '[SESSION_FILTER_MONTH, null, 'return_value'],' - wollte nur erwähnen, dass encase jemand anderen einen ähnlichen Fehler macht, ohne es zu merken. Arbeite jetzt :) – Martyn

Verwandte Themen