我是单元测试的新手,我正在尝试使用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类,结果是
当调用1次时,方法名称的期望失败等于anotherDummyFunction . 预计方法被调用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 回答
您正在使用
$this->once()
,这意味着只有在方法被调用一次时才能通过测试 - 在每个使用模拟的测试用例中!您可能想要的是
$this->any()
,它不需要每次都调用该方法 .