使用 Laravel 和 Mockery

Posted

技术标签:

【中文标题】使用 Laravel 和 Mockery【英文标题】:Using Laravel and Mockery 【发布时间】:2014-12-24 18:47:49 【问题描述】:

我只是尝试进入这个: 我有一个使用 B 类服务的 A 类。 为了隔离这个 A 类并对其进行测试,我想使用 Mockery 和存根 B 类。

我这样做了

public function testMock()


    $driver = Mockery::mock('Driver');
    App::instance('Driver',$driver);
    $driver->shouldReceive('get')->once()->andReturn('Did the job');

    $request = new BSRequest($driver);

    $this->assertEquals($request->get(),'Did the job');


但我在运行测试后总是收到此消息 ErrorException:传递给 BSrequest::__construct() 的参数 1 必须是 Driver 的实例,Mockery_0_Library_Driver 的实例,在 /var/www/laravel/app/tests/ExampleTest.php 第 56 行调用并定义

而我的 BSrequest 就是这样:

    class BSrequest 

private $driver;

public function __construct(Driver $driver) 
    $this->driver = $driver;


function get() 
    return $this->driver->get();

你能告诉我如何做到这一点吗? 谢谢

【问题讨论】:

“Driver”类真的存在吗? 【参考方案1】:

我相信您遇到了命名空间问题或者您遇到了自动加载问题。

在您的测试文件中,确保已自动加载 Driver 类。你可以这样做:

public function testDriverClassIsAvailable()


    $driver = new Driver();

    $this->assertEquals(get_class($driver), 'Driver');

如果这可行,那么您将知道您的Driver 类已自动加载且可用,并且BSRequest 类存在问题,因为它没有可用的Driver 类。如果您使用命名空间,请确保没有拼写错误。

模拟的Driver 实例应该满足BSRequest->__construct() 要求的类型提示,因此您绝对应该包含类型提示。

【讨论】:

【参考方案2】:

事实上,写作时每件事都很好

public function __construct($driver) 
    $this->driver = $driver;

这意味着删除 $driver 上的 Type 控件。 但我确信我们可以通过保留 Driver $driver 来实现所有这些目标

很遗憾,我不知道怎么做

【讨论】:

以上是关于使用 Laravel 和 Mockery的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 - 使用 composer 和 git bash 安装 laravel 时出错

使用 Laravel Livewire 和 Laravel Fortify 进行登录

在没有 Laravel 的情况下使用 Laravel 数据库迁移和种子 [关闭]

如何使用 proengsoft/laravel-jsvalidation 和 Laravel 5 验证数组输入

LARAVEL 5.3,获取用户名和角色名(使用 Laravel 模型关系)

如何在 Laravel 5.7 和 Laravel Collective 中使用动作 [重复]