【问题标题】:PHPUnit test doublesPHPUnit 测试双打
【发布时间】:2018-02-21 20:33:14
【问题描述】:

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

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

谢谢

【问题讨论】:

    标签: php phpunit stub


    【解决方案1】:

    当您模拟一个类时,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 的文档中有说明

    【讨论】:

    • 这就是所谓的“部分模拟”吗?
    • @vivoconunxino 是的,我相信是的
    猜你喜欢
    • 2015-04-11
    • 2020-11-03
    • 1970-01-01
    • 2011-02-11
    • 2011-08-10
    • 2015-12-29
    • 2014-07-07
    • 2015-04-29
    • 2019-04-21
    相关资源
    最近更新 更多