Laravel包单元测试配置文件中的辅助函数失败(调用未定义的方法base_path())

时间:2017-01-17 20:13:20

标签: php unit-testing laravel-5.3

好的,所以我正在尝试更新一个与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目录引用解决方案?任何帮助将不胜感激。

2 个答案:

答案 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 guidethis laracast

你不应该嘲笑这个方法。您不应该使用文件引用和字符串程序集替换它。执行上述任一操作都会将代码远离从Laravel集成中移除,而不是像L5升级那样移动。