好的,所以我正在尝试更新一个与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目录引用解决方案?任何帮助将不胜感激。
答案 0 :(得分:1)
对于其他使用此功能的人,我发现的解决方案是使用CreatesApplication
特性并在测试类中调用createApplication()
方法。
class MyTest extends \PHPUnit\Framework\TestCase
{
use Tests\CreatesApplication;
protected function setUp(): void
{
$this->createApplication();
}
}
将其添加到您的班级后,您可以访问诸如app()
和base_path()
之类的帮助程序类。
答案 1 :(得分:0)
base_path
是标准的Laravel助手。每次Laravel靴子都可以使用它。正确的方法是通过Laravel中包含的TestCase
基类在测试中启动Laravel。请参阅官方testing guide和this laracast。
你不应该嘲笑这个方法。您不应该使用文件引用和字符串程序集替换它。执行上述任一操作都会将代码远离从Laravel集成中移除,而不是像L5升级那样移动。