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

时间:2017-05-22 13:26:44

标签: phpunit

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!

...然后它运作正常。似乎它只需要单个方法模拟声明,即使我使用with()方法提供不同的参数 - 我希望返回值基于此变化。

我也没有从控制台获得太多信息,只是在没有异常消息的情况下告诉我Failed asserting that 500 matches expected 302.。我甚至尝试在try..catch块中包装代码但不改变输出。

1 个答案:

答案 0 :(得分:2)

您可以使用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));