2017-09-13 127 views
3

我开始使用PHPUnit的测试我的代码,但我有一些问题了解双重考验。PHPUnit的测试双打

我试图存根一个类的方法B返回真实的,而不是通常的行为(假)时,因为另一方法

我有这样

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()); 
    } 
} 

一个代码,我想我的第二个说法叫将工作,但事实并非如此。我错了,这是不可能的?还有另一种方法来测试谁依赖于另一个覆盖他的行为的功能?

感谢

回答

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

+1

文档中注意的是,它叫什么“部分模拟”? – vivoconunxino

+1

@vivoconunxino是的,我相信是这样 – apokryfos