PHPUnit根据参数改变模拟方法返回值

PHPUnit根据参数改变模拟方法返回值,phpunit,Phpunit,PHPUnit不允许我根据传入的参数指定返回值。以下给出了一个500错误: //模拟会话值 $container->get('session') ->method('get') ->with(SESSION_FILTER_MONTH) ->willReturn('2017-05'); $container->get('session') ->method('get') ->with(SESSION_FILTER_F

PHPUnit不允许我根据传入的参数指定返回值。以下给出了一个500错误:

//模拟会话值

$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!
…那就行了。看起来它只需要一个方法mock声明,即使我为with()方法提供了不同的参数——我希望返回值根据这个参数而变化


我也没有从控制台获得太多信息,它只是告诉我,
未能断言500个匹配预期的302个。
没有异常消息。我甚至尝试将代码包装在try..catch块中,但不更改输出。

您可以使用
returnValueMap
更改模拟返回的值

此方法接受一个数组,其中前n个值是正在使用的参数,最后一个值是返回值

因此,您的模拟将如下所示:

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

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

谢谢,这让我走上了正轨。我最初得到的是空值,但我猜
get
方法有第二个参数,它有一个我不知道的默认值。所以我改成了
[SESSION\u FILTER\u MONTH,null,'return\u value'],
-我只想说的是,如果有人在没有意识到的情况下犯了类似的错误,那就把它包起来。正在工作:)