PHPUnit测试加倍

时间:2017-09-13 08:13:41

标签: php phpunit stub

我开始使用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());
     }
}

我认为我的第二个断言会奏效,但事实并非如此。我错了,这是不可能的?还有另一种方法来测试一个依赖于另一个覆盖他的行为的函数吗?

谢谢

1 个答案:

答案 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());

这在example 9.11

的文档中有说明