如何重置PHPUnit模拟对象的期望

我在TestCase中进行了大量测试.我想设置一个模拟对象,在大多数测试中返回相同的值,但在一些测试中我想自定义该值.

我的想法是创建一个set_up()方法(我无法在自动调用的setUp()中设置期望值),并在每次测试开始时手动调用它.在这方法中,我会设置认的返回值,然后在需要自定义返回值的少数测试中,我会第二次调用expect,并希望覆盖认的返回值.这不起作用,返回值不会被覆盖.

这是一个简化的例子:

<?PHP

class SomeClass {
    function someMethod() {
    }
}

class SomeTest extends PHPUnit_Framework_TestCase {
    private $mock;

    function set_up() {
        $this->mock = $this->getMockBuilder('SomeClass')
            ->disableOriginalConstructor() // This is necessary in actual program
            ->getMock();
        $this->mock->expects($this->any())
            ->method('someMethod')
            ->will($this->returnValue(1));
    }

    function test() {
        $this->set_up();

        $this->mock->expects($this->any())
            ->method('someMethod')
            ->will($this->returnValue(2));

        $this->assertEquals(2, $this->mock->someMethod());
    }
}

看来这应该可以从阅读How to reset a Mock Object with PHPUnit.

PHPUnit mock with multiple expects() calls不回答我的问题.

我使用的是PHPUnit 4.2

解决方法:

您可以将参数传递给set_up方法,以便它可以根据需要配置模拟:

function set_up($someMethodReturnValue = 1) {
    $mock = $this->getMockBuilder('SomeClass')
        ->disableOriginalConstructor() // This is necessary in actual program
        ->getMock();
    $mock->expects($this->any())
        ->method('someMethod')
        ->will($this->returnValue($someMethodReturnValue));
    return $mock;
}


function test() {
    $mock = $this->set_up(2);
    $this->assertEquals(2, $this->mock->someMethod());
}

您可以进一步增强set_up()方法.如果有很多选项,最终你可以创建一个Mock创建类.

相关文章

统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...
前言 之前做了微信登录,所以总结一下微信授权登录并获取用户...
FastAdmin是我第一个接触的后台管理系统框架。FastAdmin是一...
之前公司需要一个内部的通讯软件,就叫我做一个。通讯软件嘛...
统一支付是JSAPI/NATIVE/APP各种支付场景下生成支付订单,返...