没有 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 作曲家更新问题( Illuminate\Foundation\ComposerScripts::postAutoloadDump 无法打开流:没有这样的文件或目录)
call_user_func_array() 期望参数 1 是一个有效的回调,类 'Illuminate\Auth\Guard' 没有方法 'attemp' - Laravel 中的 Auth