我有一些看起来像这样的代码:
public function foo(Bar $bar) {
if ($bar instanceof Iterator) {
//...
}
}
为了测试我正在使用:
$this->getMock('Bar');
但是,因为我的代码正在寻找实现Iterator的Bar实例,所以它实际上有两种类型。通过调用getMock('Bar')或getMock('Iterator')代码是不可测试的。
如何使模拟实现接口?这肯定是可能的吗?
答案 0 :(得分:3)
要模拟某些内容PHPUnit
将创建一个您强制模拟的类的子类。
如果Bar
实施Iterator,您的BarMock
也会实施Iterator。
<?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)
我认为您可以使用界面的完全限定名称来模拟类。然后,模拟类实现您需要的接口。