【发布时间】:2013-10-29 00:46:13
【问题描述】:
我在 PHP 中使用 Mockery 模拟接口时遇到了一个问题(我使用的是 laravel 框架,但我不确定这是否相关。
我已经定义了一个接口
<?php namespace MyNamespace\SomeSubFolder;
interface MyInterface {
public function method1();
}
我有一个类可以在其中一种方法上键入提示该接口...
<?php namespace MyNamespace\SomeSubFolder;
use MyNamespace\SomeSubFolder\MyInterface;
class MyClass {
public function execute(MyInterface $interface)
{
//does some stuff here
}
}
...我正在尝试测试 MyClass。我创建了一个看起来像这样的测试:
public function testExecute()
{
$mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface');
$mock->shouldReceive('method1')
->andReturn('foo');
$myClass = new MyClass();
$myClass->execute($mock);
}
当我运行测试时,我会收到消息
'ErrorException: 传递给 MyClass::execute 的参数 1 必须是 MyNamespace\SomeSubFolder\MyInterface 的实例,给定的 Mockery_123465456 实例......'
我不知道为什么。
在测试中我尝试了以下方法:
$this->assertTrue(interface_exists('MyNamespace\SomeSubFolder\MyInterface'));
$this->assertTrue($mock instanceof MyInterface);
并且两者都返回true,所以看起来好像我已经创建了实现接口的实例,但是当我在类上调用方法时它不同意。有什么想法???
【问题讨论】:
-
我认为您需要提供更多代码或您的实际代码,这 gist.github.com/davedevelopment/31b143fc44ec52fcc575 按预期工作
-
我在使用 Mockery 时也遇到了这个问题。我发现在启用进程隔离的情况下运行测试是可行的(但这明显更慢)。
-
我记得有一个类似的问题,实际上是 Mockery 中的一个错误。能否将 Mockery 更新为 dev-master 并查看问题是否仍然存在?