Phpunit模拟私有函数

时间:2015-10-30 08:58:26

标签: php testing phpunit

我的问题是。我有一个类,我只想测试我要测试的函数是在我要测试的类中调用一个私有函数。 private函数调用另一个类函数。

我想模拟私有函数,所以我可以将值返回给调用private的公共函数。我通过创建一个具有相同功能但具有值的新类来尝试它,我希望函数返回。

这是我的代码

//function i want to test
public function checksomedata($objectID){
        $config = $this->theprivatefunction($objectID,'id');
        return $config;
    }

我要模拟的私人功能

private function theprivatefunction($objectID,'id'){
//do some code here. nothing special
//return the value here
}

这是我的测试

public function testCheckObjectAcces() {
        $objectID = '12';
      $this->testclass->checksomedata($objectID);
    }

这是我想要打电话给我的班级返回一些价值。

public function theprivatefunction(){
        $result = "THIS VALUE NEEDS TO BE RETURNED";
        return $result;
    }

和我的setUP,我试图模拟priavte函数

$this->mockextended = new \stdClass();
        $this->mockextended = new MOCKEXTENDEDCLASSES();
        $this->testclass->theprivatefunction() = $this->mockextended->theprivatefunction();

在我的setUp中,我希望代码认为$this->testclass->theprivatefunction()$this->mockextended->theprivatefunction();

因此,当函数调用私有函数时,需要将其重定向到$this->mockextended->theprivatefunction();

1 个答案:

答案 0 :(得分:3)

这个问题有两种方法:

  1. 您将私有方法作为调用public方法的一部分进行单元测试。单元测试的目的是测试类的公共API。您通过公共API测试私有方法,因此应测试返回值,包括从private方法返回的值。如果私有方法依赖于某个外部状态,那么确保分别在测试的开始和结束时设置(并拆除)状态。
  2. 有时候,私有方法的问题根本就是不能直接测试。作为一个例子,我最近有一个实例,我写的方法是从stdin读取。据我所知,你不能在测试中为stdin分配一个值,所以我不得不将读取分离到stdin到一个单独的方法。然后,我创建了一个测试存根,它覆盖了父方法以返回预定义的值。这使您可以控制通常没有的私有方法。