如何让 PHPUnit MockObjects 根据参数返回不同的值?

2022-08-30 06:42:36

我有一个PHPUnit模拟对象,无论它的参数是什么,它都会返回:'return value'

// From inside a test...
$mock = $this->getMock('myObject', 'methodToMock');
$mock->expects($this->any))
     ->method('methodToMock')
     ->will($this->returnValue('return value'));

我希望能够做的是根据传递给 mock 方法的参数返回不同的值。我尝试过这样的东西:

$mock = $this->getMock('myObject', 'methodToMock');

// methodToMock('one')
$mock->expects($this->any))
     ->method('methodToMock')
     ->with($this->equalTo('one'))
     ->will($this->returnValue('method called with argument "one"'));

// methodToMock('two')
$mock->expects($this->any))
     ->method('methodToMock')
     ->with($this->equalTo('two'))
     ->will($this->returnValue('method called with argument "two"'));

但是这会导致PHPUnit抱怨,如果模拟不是用参数调用的,所以我假设的定义覆盖了第一个的定义。'two'methodToMock('two')

所以我的问题是:有没有办法让PHPUnit模拟对象根据其参数返回不同的值?如果是这样,如何?


答案 1

使用回调。例如(直接来自 PHPUnit 文档):

<?php
class StubTest extends PHPUnit_Framework_TestCase
{
    public function testReturnCallbackStub()
    {
        $stub = $this->getMock(
          'SomeClass', array('doSomething')
        );

        $stub->expects($this->any())
             ->method('doSomething')
             ->will($this->returnCallback('callback'));

        // $stub->doSomething() returns callback(...)
    }
}

function callback() {
    $args = func_get_args();
    // ...
}
?>

在回调()中执行所需的任何处理,并根据$args根据需要返回结果。


答案 2

来自最新的phpUnit文档:“有时,stubbed方法应该根据预定义的参数列表返回不同的值。您可以使用 returnValueMap() 创建一个将参数与相应的返回值相关联的映射。

$mock->expects($this->any())
    ->method('getConfigValue')
    ->will(
        $this->returnValueMap(
            array(
                array('firstparam', 'secondparam', 'retval'),
                array('modes', 'foo', array('Array', 'of', 'modes'))
            )
        )
    );

推荐