Coo*_*aar 7 php laravel mockery
我在PHP中使用Mockery模拟接口时遇到了一个问题(我正在使用laravel框架,但我不确定这是否相关.
我已经定义了一个接口
<?php namespace MyNamespace\SomeSubFolder;
interface MyInterface {
public function method1();
}
Run Code Online (Sandbox Code Playgroud)
我有一个类,在其中一个方法上键入接口...
<?php namespace MyNamespace\SomeSubFolder;
use MyNamespace\SomeSubFolder\MyInterface;
class MyClass {
public function execute(MyInterface $interface)
{
//does some stuff here
}
}
Run Code Online (Sandbox Code Playgroud)
...而我正在尝试测试MyClass.我创建了一个看起来像这样的测试:
public function testExecute()
{
$mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface');
$mock->shouldReceive('method1')
->andReturn('foo');
$myClass = new MyClass();
$myClass->execute($mock);
}
Run Code Online (Sandbox Code Playgroud)
当我运行测试时,我收到了消息
'ErrorException:传递给MyClass :: execute的参数1必须是MyNamespace\SomeSubFolder\MyInterface的实例,Mockery_123465456的实例给出....
我不知道为什么.
在测试中我尝试了以下内容:
$this->assertTrue(interface_exists('MyNamespace\SomeSubFolder\MyInterface'));
$this->assertTrue($mock instanceof MyInterface);
Run Code Online (Sandbox Code Playgroud)
并且都返回true,所以看起来好像我已经创建了实现接口的实例,但是当我在类上调用该方法时,它不同意.有任何想法吗???
4ek*_*tik 12
你应该在模拟声明和模拟声明中调用mock()方法.
$mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface');
$mock->shouldReceive('method1')
->andReturn('foo')
->mock();
Run Code Online (Sandbox Code Playgroud)
awe*_*wei -1
我认为问题出在 PHP 类加载上。您的“MyNamespace\SomeSubFolder\MyInterface”类在您的测试文件中不可用。
您需要修改您的composer.json以自动加载该名称空间,或者您需要在测试顶部添加 require_once('path/to/file/containing/namespace/MyInterface.php') 。
不过,当您尝试使用 interface_exists 时,它似乎通过了。也可能是您在模拟名称空间类时拼写错误。我也犯过这样的错误。
无论如何,Mockery 无法看到该类的存在,因此它只是发明了一个类。
您能提供完整的测试源吗?
| 归档时间: |
|
| 查看次数: |
4349 次 |
| 最近记录: |