如何获取PHPUnit MockObjects以基于参数返回不同的值? [英] How can I get PHPUnit MockObjects to return different values based on a parameter?

查看:94
本文介绍了如何获取PHPUnit MockObjects以基于参数返回不同的值?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个PHPUnit模拟对象,无论其参数如何,该对象都会返回'return value':

I've got a PHPUnit mock object that returns 'return value' no matter what its arguments:

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

我想做的是根据传递给模拟方法的参数返回一个不同的值.我已经尝试过类似的事情:

What I want to be able to do is return a different value based on the arguments passed to the mock method. I've tried something like:

$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"'));

但是如果未使用参数'two'调用该模拟,这将导致PHPUnit抱怨,因此我认为methodToMock('two')的定义将覆盖第一个的定义.

But this causes PHPUnit to complain if the mock isn't called with the argument 'two', so I assume that the definition of methodToMock('two') overwrites the definition of the first.

所以我的问题是:是否有任何方法可以使PHPUnit模拟对象根据其参数返回不同的值?如果可以,怎么办?

So my question is: Is there any way to get a PHPUnit mock object to return a different value based on its arguments? And if so, how?

推荐答案

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

Use a callback. e.g. (straight from PHPUnit documentation):

<?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();
    // ...
}
?>

在callback()中进行所需的任何处理,并根据需要根据$ args返回结果.

Do whatever processing you want in the callback() and return the result based on your $args as appropriate.

这篇关于如何获取PHPUnit MockObjects以基于参数返回不同的值?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆