2017-07-30 15 views
0

我尝试测试时无法为内部方法设定值。这里我写了一个样本班。我为同一个类创建了模拟对象,但不起作用。php单位的内部方法的设定值

class A 
{ 
    public function OneTest() 
    { 
     if($this->TwoTest()){ 
      return true; 
     } 
    } 

    public function TwoTest() 
    { 
     // return somethings 
    } 
} 

我是新的phpunit测试写作。如果有一位专家帮助我,那对我有好处。我想测试这种方法。我曾尝试过:

class ATest extends \PHPUnit_Framework_TestCase 
{ 
    public function testOne() 
    { 
     $helper = new testOne(); 

     // trying to set TwoTest() method value but does not effect. 
     $mock = $this->createMock(A::class); 
     $mock->method("TwoTest") 
      ->willReturn(true); 

     $this->assertTrue($helper->OneTest(); 
    } 
} 

其实我不知道如何使用我的模拟方法结果。我在twoTest方法中的实际实现包含一些与数据库相关的代码。我不想在测试时间运行db代码。

回答

1

你和你的模拟很接近。你想要做的就是部分嘲弄。这是通过创建A的模拟来完成的,其中只有TwoTest被模拟,即它现在总是返回true,并且永远不会实际调用A中原始实现中的实际代码,而所有其他方法仍像以前那样起作用。因此拨打$mock->OneTest()应返回预期结果。由于您在(部分)模拟的实例上进行了两个呼叫,因此您不需要$helper。所以,你的测试可能会是这个样子:

public function testOneWhenTwoTestReturnsTrue() 
{ 
    $mock = $this->getMockBuilder(A::class) 
     ->setMethods(["TwoTest"]) 
     ->getMock(); 
    $mock->method("TwoTest") 
     ->willReturn(true); 

    $this->assertTrue($mock->OneTest(); 
} 

请注意,我用getMockBuilder(),而不是只是createMock()setMethods()是我们需要为您的测试。我们只覆盖我们想要模拟的一种方法,其余的将像原始类中定义的那样运行。引用文档:

setMethods(array $ methods)可以在模拟构建器对象上调用,以指定要用可配置测试对象替换的方法。其他方法的行为不会改变。如果您调用setMethods(null),则不会替换任何方法。