2010-07-14 60 views
33

有时候在我的代码,我会检查,看是否有特定的对象实现的接口:PHPUnit的,嘲笑的接口,和的instanceof

if ($instance instanceof Interface) {}; 

然而,PHPUnit中创建上述接口的嘲笑,我不能似乎通过了这个测试。

// class name is Mock_Interface_431469d7, does not pass above check 
$instance = $this->getMock('Interface'); 

据我所知,拥有一个名为Interface的类与实现Interface的类不同,但我不确定如何处理这个问题。我不得不模拟一个实现Interface的具体类吗?这不会破坏使用可移植界面的目的吗?

感谢

回答

38

这个工作对我来说:

$mock = $this->getMock('TestInterface'); 
$this->assertTrue($mock instanceof TestInterface); 

也许这是一个错字或也许$实例不是你想它是什么?

+12

是的,冷却器头为准。经过一整晚睡眠之后,我意识到我在嘲笑对象时并未使用完全限定的命名空间。 – 2010-07-15 13:53:03

+0

略有不同的用例,但我可以检查一个实例是类的实例还是类的模拟实例。 – kapad 2013-08-24 21:51:23

+0

@kapad您会发现,这是多态性的主要观点,您不必知道当前对象是否为class或mock的实例。如果你仍然需要知道,那么你做错了什么。 P.S.只是FYI你可以使用[get_class](http://ca1.php.net/manual/en/function.get-class.php)函数来知道对象的确切类名 – dVaffection 2013-10-02 22:47:48

47

还有assertInstanceOf如3.5.0

例:

$this->assertInstanceOf('\Models\User', $this->userService->findById(1)); 
+2

_这是推荐的类型检查方法。 – stefgosselin 2011-05-20 09:07:47

+1

除了@stefgosselin答案,这是推荐的类型检查方式,因为你变得更好,自我解释错误消息。比较'''失败断言该对象是Class'''的实例'''失败asserting false' true'''。 – 2015-02-10 19:51:02

+2

从PHP 5.5开始,您可以使用'\ Models \ User :: class'而不是'\ Models \ User'',这使得重构变得容易很多。 – 2017-01-09 10:08:54