在 Laravel 中使用 Mockery/phpUnit 时出错

Posted

技术标签:

【中文标题】在 Laravel 中使用 Mockery/phpUnit 时出错【英文标题】:Error using Mockery/phpUnit in Laravel 【发布时间】:2016-10-01 07:20:30 【问题描述】:

我是一名新手开发人员,试图为现有的 laravel 应用程序启动一个测试套件,但我没有测试经验。现在我只是在尝试构建一些测试来获得一些信心和经验来编写更多实质性的测试。我正在尝试测试模型上的关系(我意识到这不是一个非常明智的测试)并尝试创建一个模拟模型对象来这样做(我也知道最好在 sqlite db 的内存中执行此操作,但主要这里的目标是测试控制器,但我不知道如何处理那里的身份验证问题)。我有以下简单而愚蠢的测试:

public function testFoo()

    $lead = m::mock('Lead');

    $this->mock->shouldReceive('program')->once();

    $this->assertEquals($lead->program_id, $lead->program->id);

但我收到以下错误:

LeadTest::testFoo
BadMethodCallException: Received Mockery_0_Lead::getAttribute(), but no expectations were specified

我不明白这个错误试图告诉我什么,我在谷歌搜索问题或阅读我能找到的文档时找不到任何帮助。

我假设我没有设置预期的返回值,但这是一个非常通用的测试,对预期的返回值进行硬编码似乎并不正确。我在这里错过了什么?

我只是在测试 Laravel 关系以确保我已正确设置/实施:

public function program()

    return $this->belongsTo('Program');

【问题讨论】:

如果您可以发布您尝试测试的原始函数,这可能会有所帮助,这样我们就可以更好地了解最终结果应该是什么。 【参考方案1】:

问题是我缺少预期的返回值。应该是这样的:

$this->mock->shouldReceive('program')->once()->andReturn(someObjectOrValue);

断言应该是这样的:

$this->assertEquals(someObjectOrValue, $lead->program->id);

Mockery 文档比我最初想象的要冗长得多。 http://docs.mockery.io/en/latest/reference/expectations.html

【讨论】:

以上是关于在 Laravel 中使用 Mockery/phpUnit 时出错的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 使用外部类

如何在 Laravel 外部的包中使用 Laravel 外观(缓存、日志、存储)

Laravel - 如何在本地开发中使用 https 服务 laravel 项目

在 laravel 4.2 中,用户 'root'@'localhost' 的 Laravel 访问被拒绝(使用密码:YES)

使用 Laravel Lighthouse 在 Laravel 7 中出现 CORS 错误

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