【问题标题】:Mock Illuminate Config facade without Laravel没有 Laravel 的模拟 Illuminate Config 外观
【发布时间】: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

【问题讨论】:

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


    【解决方案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 问题。

    【讨论】:

      猜你喜欢
      • 2014-02-17
      • 2019-01-11
      • 2022-01-04
      • 1970-01-01
      • 2012-07-12
      • 2012-08-21
      • 2018-05-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多