【发布时间】: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