PHPUnit模拟多种不同的方法

时间:2015-08-04 17:35:03

标签: php unit-testing mocking phpunit

我是单元测试的新手,我正在尝试使用PHPUnit框架。

我有一个函数可以调用另外两个函数:

class Dummy{
    public function dummyFunction(){
        $this->anotherDummyFunction();
        .....
        $this->yetAnotherDummyFunction();
    }
    public function anotherDummyFunction(){

        .....

    }
    public function yetAnotherDummyFunction(){

        .....

    }
}

我想测试在调用dummyFunction()时调用这两个函数。

这里是测试类:

class TestDummyClass {
    public function testDummyFunction(){

        $dummyClassMock = $this->getMockBuilder('Dummy')
                     ->setMethods( array( 'anotherDummyFunction','yetAnotherDummyFunction' ) )
                     ->getMock();

        $dummyClassMock->expects($this->once())
             ->method( 'anotherDummyFunction' );

        $dummyClassMock->expects($this->once())
             ->method( 'yetAnotherDummyFunction' );

        $dummyClassMock->dummyFunction();
   }
}

现在我注意到如果我以这种方式模拟Dummy类,结果是

  

方法名称的期望失败等于anotherDummyFunction   当被调用1次时。预计方法被称为1次,   实际上叫了0次。

但是如果我以这种方式设置模拟对象

$dummyClassMock = $this->getMockBuilder('Dummy')
                     ->setMethods( array( 'anotherDummyFunction' ) )
                     ->getMock();

测试通过。最后,如果我使用setMethods(null)设置模拟对象,则测试再次失败

似乎我只能传递一个只有一个元素的数组,我想检查的方法是否被调用。但我在这里看到:https://jtreminio.com/2013/03/unit-testing-tutorial-part-5-mock-methods-and-overriding-constructors/ setMethods用于注入传递方法的返回值,所以这对调用本身没有影响,除非我把dummyFunction放在setMethods中(在这种情况下)函数将返回null而不调用其他两个方法,并且以这种方式是,测试必须失败)

我做错了什么?我已经看到了一些代码片段,其中有多个方法在setMethods()中......如果我把这些方法放在setMethods中,为什么测试失败?

由于

1 个答案:

答案 0 :(得分:3)

您正在使用$this->once(),这意味着只有在方法被调用一次时才能通过测试 - 在每个使用模拟的测试用例中!

您可能想要的是$this->any(),它不需要每次都调用该方法。