PHPUnit模拟多种不同的方法

标签 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 类,结果是

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 用于注入(inject)传递的方法的返回值,所以这不会对调用本身产生影响,除非我将 dummyFunction 放在 setMethods 中(在这种情况下,函数将返回 null 而不会调用其他两个方法,这样是的,测试必须失败)

我做错了什么?我看过一些代码,其中 setMethods() 中有多个方法...如果我将这些方法放在 setMethods 中,为什么测试会失败?

谢谢

最佳答案

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

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

关于PHPUnit模拟多种不同的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31815746/

相关文章:

php - Laravel 4 - 路线::任何除了

django - 在 Django 1.7 中运行单元测试时禁用迁移

unit-testing - 如何使用 Jersey(测试框架)将数据源依赖项注入(inject) RESTful Web 服务?

php - MySQL php 插入...选择 : use commas to join $var+value

php - 如何让 li 类在 laravel 中动态激活?

php - 根据 Woocommerce 中的产品类别自定义产品价格后缀

java - 单元测试和日志记录

javascript - Jasmine 中 NUnit 的 TestCaseSource 是否有相应的设置?

rest - 使用 SSL 的 SoapUI REST 模拟服务

firebase - 有没有办法对于Jest的方式模拟 firebase 模块?