我开始使用PHPUnit来测试我的代码但是我在理解双重测试时遇到了一些问题。
我尝试将一个类方法b存根,以便在从另一个方法调用时返回true而不是通常的行为(false)
我有这样的代码
class MyClass {
function a()
{
return $this->b();
}
function b()
{
return false;
}
}
class MyClassTest extends TestCase
{
function testAThrowStubB()
{
$myClassStub = $this->getMockBuilder('\MyClass')
->getMock();
$myClassStub->expects($this->any())
->method('b')
->willReturn(true);
// this assert will work
$this->assertTrue($myClassStub->b());
// this assert will fail
$this->assertTrue($myClassStub->a());
}
}
我认为我的第二个断言会奏效,但事实并非如此。我错了,这是不可能的?还有另一种方法来测试一个依赖于另一个覆盖他的行为的函数吗?
谢谢
答案 0 :(得分:3)
当你模拟一个类时,PHPUnit框架希望你嘲笑整个类。您没有指定任何返回值的任何方法都将默认返回null
(这就是第二次测试失败的原因)。
如果要模拟方法的子集,请使用setMethods
函数:
$myClassStub = $this->getMockBuilder(MyClass::class)
->setMethods(["b"])
->getMock();
$myClassStub->expects($this->any())
->method('b')
->willReturn(true);
// this assert will work
$this->assertTrue($myClassStub->b());
// this assert will work too
$this->assertTrue($myClassStub->a());
的文档中有说明