【问题标题】:Error when mocking interfaces in PHP using Mockery使用 Mockery 在 PHP 中模拟接口时出错
【发布时间】: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 并查看问题是否仍然存在?

标签: php laravel mockery


【解决方案1】:

你应该在 mock 声明的 and 处调用 mock() 方法。

$mock = Mockery::mock('MyNamespace\SomeSubFolder\MyInterface');

$mock->shouldReceive('method1')
     ->andReturn('foo')
     ->mock();

【讨论】:

  • 我也很感兴趣这是从哪里来的。文档中的任何地方都没有提到它。但我的模拟基本上总是需要这个额外的-&gt;mock() 调用。
  • 想通了:我错误地链接了像 $mock = Mockery::mock(...)-&gt;shouldReceive(); 这样的方法,实际上应该是 $mock = ...; $mock-&gt;shouldReceive();
【解决方案2】:

我认为问题在于 PHP 类加载。您的 'MyNamespace\SomeSubFolder\MyInterface' 类在您的测试文件中不可用。

您需要修改 composer.json 以自动加载该命名空间,或者您需要在测试顶部添加一个 require_once('path/to/file/ contains/namespace/MyInterface.php')。

虽然,当您尝试 interface_exists 时,它似乎通过了。也可能是您在模拟命名空间类时拼错了它。我也犯了这个错误。

无论如何,Mockery 无法看到该类的存在,所以它只是在发明一个。

你能提供你的完整测试源吗?

【讨论】:

  • 他没有使用构造函数。
猜你喜欢
  • 2019-02-19
  • 2022-01-04
  • 2013-09-30
  • 2016-10-01
  • 2018-03-26
  • 2018-07-02
  • 2018-09-13
  • 2014-11-05
  • 2015-10-16
相关资源
最近更新 更多