没有Laravel的Mock Illuminate Config门面

时间:2017-02-13 15:23:54

标签: testing laravel-5 phpunit mockery laravel-facade

我正在开发一个依赖于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存储库依赖项,但我在Config模型使用的特征中使用Eloquent外观因此DI不起作用。

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

谢谢!

PS:此问题也发布在Laracasts

2 个答案:

答案 0 :(得分:0)

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

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

来自documentation

  

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

这样,设置配置值就像调用Config::set()一样,就像完整的Laravel安装一样。不再有Mockery个问题。

答案 1 :(得分:0)

我遇到了同样的问题。流明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');