告诉phpunit调用public而不是private

时间:2015-10-30 09:52:51

标签: php testing phpunit

我的问题是。我有一个我想测试的课程(myClass)。在myClass中有一个函数,它调用私有函数也在myClass中。

我知道我无法测试私人功能。有可能告诉phpunit调用另一个函数而不是私有函数吗?

示例

$this->testclass现在是我要测试的课程

$this->testclass = new \stdClass();
$this->testclass->mock = $this->getMockBuilder('myClass')->getMock();

在我的测试用例之外,我创建了一个假类。

$this->mockextended = new \stdClass();
$this->mockextended->mock = new MOCKEXTENDEDCLASSES();
$this->mockextended中的

我有公共功能。

我要测试的功能

public function TestMe(){
$this->somePrivateFunctioniHate(); <==== this is the pain in my ass
}

和私人功能

private function somePrivateFunctioniHate(){
   //come code
    }

我想做的是。 TestMe函数正在调用私有函数。 是否有可能告诉phpunit覆盖私有函数并调用$this->mockextended;内的另一个函数 我试过这样的。

$this->testclass->somePrivateFunctioniHate() = $this->mockextended->theWholeNewPrivateFunction()

只有这个给了我一个很好的错误。我之前做过这件事并且有效。像这样称呼它

修改 对于那些不理解我的问题的人。 我有另一个函数调用另一个类。我不想在我的测试中有另一个课程,所以我在我的测试用例之外创建了一个假类。插入与函数要包含的类相同的函数。它喜欢这个

  $this->testclass->chunks = new \stdClass();
    //MOCKchunckTpl is the fake class outside my testcase
            $this->testclass->chunks->config = new MOCKchunkTpl(); 

这很有效。每当函数想要调用$this->testclass->chunks->config->Somefunction();时,它都会被重定向到我的假类。

当我尝试对调用私有函数的函数执行相同操作时。与$this->testclass->somePrivateFunctioniHate() = $this->mockextended->theWholeNewPrivateFunction()一样,它提供了一个很好的错误

Fatal error: Can't use method return value in write context in

1 个答案:

答案 0 :(得分:2)

简短回答:不,没有。 PHPUnit无法操纵私有方法。

模拟用于伪造类的行为,这取决于您要测试的类。如果您需要覆盖私有方法,那么您的架构中就会出现问题。私有方法应该通过简单测试使用它们的公共方法来测试。如果您需要单独测试,请将其公开。

编辑:以下是使用私有方法测试简单代码或将此私有方法放在另一个类中的示例:

<强> 1。私人方法

class MyClass {

    public function myMethod() {
        return $this->myPrivateMethod();
    }

    private function myPrivateMethod() {
        return 2;
    }

}

测试类:

class MyClassTest extends \PHPUnit_Framework_TestCase {

    public function testMyMethod() {
        $myClass = new MyClass();
        // don't mind the private method, just test if the public method is working
        $this->assertEquals(2, $myClass->myMethod());
    }

}

<强> 1。第二课

class MyClass {

    public $dependentClass;

    public function myMethod() {
        return $this->dependentClass->dependentMethod();
    }

}

依赖类:

class DependentClass {

    public function dependentMethod() {
        return 38943;
    }

}

使用MyClass

测试DependentClass
class MyClassTest extends \PHPUnit_Framework_TestCase {

    public function testMyMethod() {
        $dependentMock = $this->getMockBuilder("DependentClass")->getMock();
        $dependentMock->expects($this->any())
            ->method("dependentMethod")
            ->willReturn($this->returnValue(2));

        $myClass = new MyClass();
        $myClass->dependentClass = $dependentMock;

        $this->assertEquals(2, $myClass->myMethod());
    }

虽然我们在DependentClass中定义了一个完整的其他回报,但测试仍然会通过,因为我们嘲笑它并且能够定义我们期望DependentClass拥有的每个行为。

但是为了干净地测试项目,我们需要为DependentClass定义另一个测试,以测试此类是否正常工作。如果该测试不再起作用,则该测试失败,而不是MyClass的测试。