无法在PHPUnit中使用Mock类测试静态方法

时间:2014-01-19 17:18:07

标签: php unit-testing phpunit

我正在尝试在类上测试静态方法,但它依赖于静态数组属性,它不会在测试之间重置,所以我可以创建一个模拟类&对此进行测试。

唯一的问题是mock类静态方法没有像原始静态方法那样返回值。

这是我的班级......

class Thing {
    static public function doThing() {
        return 'yeah!';
    }
}

......这里是测试班......

class ThingTest {
    public function testDoSomething() {
        $mock_class = $this->getMockClass('Thing');
        $this->assertEqual('yeah!', $mock_class::doThing())
    }
}

此测试失败,并显示消息“无法断言null匹配预期'是啊!'。”

我在这里缺少什么?我认为没有在getMock()调用上指定方法意味着原始方法结转,但显然不是。 :O(

任何指针都会很棒。感谢。

修改

我从内存中输入了这个内容,而不是复制代码,因为我进行了进一步的更改以尝试解决此问题。在为模拟对象编写更多测试之后,我意识到如果你将array()作为第二个参数($ methods)传递给getMock [Class],那么它会删除所有方法,&我相信这就是我实际做过的事情。我这样做,因为我也想在第三个参数中传递构造函数参数。代码可能看起来更像......

class ThingTest {
    public function testDoSomething() {
        $mock_class = $this->getMockClass(
            'Thing',
            array(),
            array( 'something' )
        );
        $this->assertEqual('yeah!', $mock_class::doThing())
    }
}

3 个答案:

答案 0 :(得分:0)

也许$mock_class是一个对象,而不是字符串类名?尝试使用下一个:

class ThingTest {
    public function testDoSomething() {
        $mock_class = $this->getMockClass('Thing');
        $this->assertEqual('yeah!', Thing::doThing())
    }
}

这有用吗?

答案 1 :(得分:0)

您不应该模拟包含要测试的方法的类。如果您模拟了类,则在未通过

定义之前不能调用任何方法
-> expects('methodName') 
-> with($this->equalTo($parameter),[$this->equalTo($parameter2),...]) 
-> will($this->returnValue($value))

。模拟用于降低测试的复杂性。假设你想测试一个如下所示的函数:

class test{
    private $someClass;

    public function __construct(SomeInterface $someClass){
        $this -> someClass = $someClass;
    }
    public function test(){
        $someVariable = $this -> someClass -> doSomething();
        changeSomething($someVariable);
        return $someVariable;
    }
}

如果你不模拟someClass,你必须测试someClass的整个代码 - >做一点事。但那不是你想要做的。你只想使用函数doSomething的返回。这就是你需要模拟的地方。它降低了测试的复杂性,并提供REAL UNIT测试,而不是测试整个应用程序。

所以你需要做的是:

class ThingTest {
    public function testDoSomething() {
        $class = new Thing();
        $this->assertEquals('yeah!', $class::doThing());
    }
}

不需要模拟。

答案 2 :(得分:0)

您忘了按PHPUnit_Framework_TestCase延长。

class ThingTest extends PHPUnit_Framework_TestCase {
  public function testDoSomething() {
     $mock_class = $this->getMockClass('Thing');
     $this->assertEqual('yeah!', $mock_class::doThing())
  }
}