【问题标题】:Laravel package unit testing failing for helper function in config file (call to undefined method base_path())Laravel 包单元测试在配置文件中的帮助函数失败(调用未定义的方法 base_path())
【发布时间】:2017-01-17 20:13:19
【问题描述】:

好的,所以我正在尝试更新一个我在 Laravel 4 中使用过的包以与 Laravel 5 兼容,因为原始存储库有一段时间没有任何更新,它需要一些调整才能使用 Laravel 5。

我已经进行了必要的更改,并为原始存储库创建了一个pull request

不过,我注意到单元测试失败了,所以我尝试深入研究它。到目前为止,我还没有用 PHPUnit 做过任何事情,所以我认为这将是一次很好的学习体验。

我不是就 github 上显示的错误寻求帮助。我设法克服了这个错误,但我通过删除一些测试来实现这一点,这当然不是一个实际的解决方案,因此这些更改没有提交。一旦我对单元测试的工作原理有了更好的理解,我就会解决这个问题。

我似乎遇到的问题是 Laravel 的辅助函数之一正在包的默认配置文件中使用,它说函数 base_path() 未定义。

据我了解,PHPUnit 与类一起工作,我需要模拟该函数才能使用它。似乎无法找到一个直接的答案如何做到这一点。

由于它将配置变量指向我的存储库层次结构中不存在的文件夹,我什至不确定它应该返回什么。

导致问题的文件是位于 polyglot/config/polyglot.php 中的默认配置

return [

// Whether to swap out the facades (Router, Lang, etc) with
// Polyglot's, disable this if you need other packages to do the same
// Can specify an array of facades to swap, eg. ['Lang', 'URL']
'facades' => true,

// Locales
////////////////////////////////////////////////////////////////////

// The default locale if none is provided in the URL
// Leave empty to force the use of locales prefixes in URLs
'default' => 'en',

// The fallback locale for translations
// If null, the default locale is used
'fallback' => null,

// The available locales
'locales' => [],

// Gettext
////////////////////////////////////////////////////////////////////

// The domain of your translations, for gettext use
'domain' => 'messages',

// Where the PO/MO files reside

'folder' => base_path('resources/lang'),
// Format of the compiled files
'file' => '{domain}.po',

// Database
////////////////////////////////////////////////////////////////////

// The pattern Polyglot should follow to find the Lang classes
// Examples are "Lang\{model}", "{model}Lang", where {model}
// will be replaced by the model's name
'model_pattern' => '{model}Lang',

];

那么,在这种情况下,典型的做法是什么?手动定义函数?以某种方式包含帮助文件?还是放弃使用该函数并使用基本的 php 目录引用的解决方案?任何帮助将不胜感激。

【问题讨论】:

  • 你能发布一些代码吗?比如:调用base_path的代码、正在爆炸的PHPUnit测试、PHPUnit配置等等。
  • 所有 27 个测试都因此而失败。我不确定您所说的配置是什么意思,但版本是 4.8。我最初并没有编写测试,对它们的工作原理只有一点点线索。你可以在这里找到整个包github.com/Anahkiasen/polyglot(开发分支)我还链接到原始问题中的拉取请求。
  • base_path 是一个标准的 Laravel 助手。每次 Laravel 启动时都可以使用它。正确的做法是在测试中启动 Laravel(使用 Laravel 附带的 TestCase)。不太恰当的是嘲笑它(可能只是function base_path() { return __DIR__; } 或类似的东西)。最不恰当的是使用 PHP 文件引用和字符串汇编来构建它。
  • 啊,这个包目前直接使用 phpunit 库,尽管依赖于 laravel。我刚刚找到这篇文章,我认为它应该足以让我开始。 laracasts.com/discuss/channels/guides/… 谢谢
  • 我已将这些 cmets 包装成一个有凝聚力的答案。如果这确实回答了您的问题,请接受。

标签: php unit-testing laravel-5.3


【解决方案1】:

base_path 是一个标准的 Laravel 助手。每次 Laravel 启动时都可以使用它。正确的方法是通过 Laravel 中包含的 TestCase 基类在您的测试中启动 Laravel。参考官方testing guidethis laracast

您不应该模拟该方法。您不应将其替换为文件引用和字符串程序集。执行上述任一操作会将代码从 Laravel 集成中移开,而不是像 L5 升级那样移向。

【讨论】:

    【解决方案2】:

    对于其他在谷歌上搜索的人,我找到的解决方案是使用 CreatesApplication 特征并在您的测试类中调用 createApplication() 方法。

    class MyTest extends \PHPUnit\Framework\TestCase
    {
       use Tests\CreatesApplication;
    
        protected function setUp(): void
        {
            $this->createApplication();
        }
    }
    

    将其添加到您的类后,您就可以访问诸如app()base_path() 等辅助类。

    【讨论】:

      猜你喜欢
      • 2014-04-19
      • 2018-07-03
      • 2021-09-16
      • 1970-01-01
      • 1970-01-01
      • 2016-04-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多