编程语言
首页 > 编程语言> > PHPUnit Mock多种不同的方法

PHPUnit Mock多种不同的方法

作者:互联网

我是单元测试的新手,正在尝试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类,结果是

Expectation failed for method name is equal to anotherDummyFunction
when invoked 1 time(s). Method was expected to be called 1 times,
actually called 0 times.

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

$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中,为什么测试失败?

谢谢

解决方法:

您正在使用$this-> once(),这意味着仅在方法被精确调用一次的情况下才能通过测试-在使用了模拟的每个测试案例中!

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

标签:unit-testing,mocking,phpunit,php
来源: https://codeday.me/bug/20191119/2039876.html