PHPUnit同时是mock接口和类

时间:2012-11-01 12:20:50

标签: php unit-testing tdd phpunit

我有一些看起来像这样的代码:

public function foo(Bar $bar) {
    if ($bar instanceof Iterator) {
        //...
    }
}

为了测试我正在使用:

$this->getMock('Bar');

但是,因为我的代码正在寻找实现Iterator的Bar实例,所以它实际上有两种类型。通过调用getMock('Bar')或getMock('Iterator')代码是不可测试的。

如何使模拟实现接口?这肯定是可能的吗?

2 个答案:

答案 0 :(得分:3)

要模拟某些内容PHPUnit将创建一个您强制模拟的类的子类

如果Bar实施Iterator,您的BarMock也会实施Iterator。

Sample.php

<?php

interface myInterface {

    public function myInterfaceMethod();

}

class Bar implements myInterface {

    public function myInterfaceMethod() {
    }

}

class TestMe {

    public function iNeedABar(Bar $bar) {
        if ($bar instanceOf myInterface) {
            echo "Works";
        }
    }
}

class TestMeTest extends PHPUnit_Framework_TestCase {

    public function testBar() {
        $class = new TestMe();
        $bar = $this->getMock('Bar');
        $class->iNeedABar($bar);
    }

}

输出:

phpunit Sample.php 
PHPUnit 3.7.8 by Sebastian Bergmann.

.Works

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 0 assertions)

答案 1 :(得分:-1)

我认为您可以使用界面的完全限定名称来模拟类。然后,模拟类实现您需要的接口。