1

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

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

为了测试这一点,我正在使用:

$this->getMock('Bar');

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

如何使模拟实现接口?这一定是可能的,当然?

4

2 回答 2

3

模拟某些东西PHPUnit会创建一个你告诉它模拟的类的子类。

如果Bar实现了迭代器,你BarMock也将实现迭代器。

示例.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)
于 2012-11-01T15:51:55.293 回答
-1

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

于 2013-09-27T09:38:07.940 回答