没有 Laravel 的模拟 Illuminate Config 外观

Posted

技术标签:

【中文标题】没有 Laravel 的模拟 Illuminate Config 外观【英文标题】:Mock Illuminate Config facade without Laravel 【发布时间】:2017-07-01 15:29:39 【问题描述】:

我正在开发一个依赖于Config 外观的包。 代码本身运行良好,但我在测试时遇到了问题。

最初,我使用的是以下代码:

Config::shouldReceive('foo.bar')
    ->andReturn(true);

和others一样多,我遇到了一些问题。

我后来读到了嘲笑Config门面isn't encouraged。

为了解决这个问题,大多数人倾向于建议改用以下方法:

Config::set('foo.bar', true);

如果您从 Laravel/Lumen 进行测试,我认为这可以正常工作。

但我的问题是,我不是。我只依赖一些Illuminate 包,所以这不起作用,因为我得到: RuntimeException: A facade root has not been set.

此时,有些人可能会建议我只注入 Config 存储库依赖项,但我在 Eloquent 模型使用的特征中使用 Config 外观,因此 DI 不会工作。

我还有其他方法可以解决这个问题吗?

谢谢!

PS:这个问题也已经发到Laracasts

【问题讨论】:

【参考方案1】:

我遇到了同样的问题。流明 5.4 使用Config::set('key', 'value') 无效。所以我不得不用这种方式。

//test
use Illuminate\Support\Facades\Config;

Config::shouldReceive('get')
                    ->once()
                    ->with('key')
                    ->andReturn('value');

,

//code
use Illuminate\Support\Facades\Config;

Config::get('key'); //instead config('key');

【讨论】:

您的问题与我的无关。您正在使用 Lumen,它仍然包含大部分 Illuminate 包,因此只要您在 bootstrap/app.php 中启用 Facades,Config::set() 应该可以工作。我的用例是在独立环境中测试 Laravel/Lumen 包,您没有完整的框架可供使用,因此您必须依赖 Testbench。此外,如文档中所述,模拟 Config 不是最佳实践。因此,投反对票。【参考方案2】:

对于那些遇到类似问题的人,我终于找到了解决这个问题的正确方法。

测试 Laravel 包正是 Testbench 包的用途。

来自documentation:

要使用 Testbench 组件,您只需扩展 Orchestra\Testbench\TestCase 而不是 PHPUnit\Framework\TestCase

这样,设置配置值只需调用Config::set(),就像在完整的 Laravel 安装中一样。没有更多的Mockery 问题。

【讨论】:

以上是关于没有 Laravel 的模拟 Illuminate Config 外观的主要内容,如果未能解决你的问题,请参考以下文章

模拟 Illuminate\Database\Eloquent\Model

Laravel 4.2 Illuminate Facade 没有得到解决

模拟 laravel 缓存助手

如何修复 laravel 作曲家更新问题( Illuminate\Foundation\ComposerScripts::postAutoloadDump 无法打开流:没有这样的文件或目录)

call_user_func_array() 期望参数 1 是一个有效的回调,类 'Illuminate\Auth\Guard' 没有方法 'attemp' - Laravel 中的 Auth

如何用 phpunit 模拟 Laravel Eloquent 模型?