使用PHPUnit覆盖Laravel 5中的助手

时间:2017-12-06 12:53:38

标签: laravel laravel-5 phpunit composer-php

我一直在按照此处提供的建议覆盖我的route,创建我自己的helpers.php并将其加载到引导程序中。它在浏览器中运行良好,但在PHPUnit中没有那么多:

PHP Fatal error:  Cannot redeclare route() (previously declared in /var/www/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:707) in /var/www/app/Http/helpers.php on line 25

似乎PHPUnit正在调用供应商自动加载而不是phpunit.xml中设置的引导程序,我不知道如何覆盖它。

这是我在Laravel helpers.php

中抛出异常时得到的调用堆栈
#0 /var/www/vendor/composer/autoload_real.php(66): require()
#1 /var/www/vendor/composer/autoload_real.php(56): composerRequirefaa86f5c74caea0c3ebf4fa6247e01ed('f0906e6318348a7...', '/var/www/vendor...')
#2 /var/www/vendor/autoload.php(7): ComposerAutoloaderInitfaa86f5c74caea0c3ebf4fa6247e01ed::getLoader()
#3 /var/www/vendor/phpunit/phpunit/phpunit(51): require('/var/www/vendor...')
#4 {main}
  thrown in /var/www/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php on line 699

只有我无法控制的元素。

修改

我在composer.json进行了一些编辑,以加载我的助手。它现在生成vendor/composer/autoload_files.php

<?php

// autoload_files.php @generated by Composer

$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);

return array(
    // ...

    'f0906e6318348a765ffb6eb24e0d0938' => $vendorDir . '/laravel/framework/src/Illuminate/Foundation/helpers.php',
    '58571171fd5812e6e447dce228f52f4d' => $vendorDir . '/laravel/framework/src/Illuminate/Support/helpers.php',
    '224ac75459a4044275cfdffe33336135' => $baseDir . '/app/Http/helpers.php',
);

基本上,如果我有办法在Laravel之前注射助手,这可以解决我的问题。

我真的很喜欢调试这个东西,听到我脑子里的这首小歌曲&#34;有一个很好的主意,那些整洁的静态帮助者&#34;,它的grooooovy。

1 个答案:

答案 0 :(得分:0)

如果您阅读了问题的编辑,您就会明白在自动加载中注入文件不起作用。

https://packagist.org/packages/funkjedi/composer-include-files就是为了解决这个问题。

首先运行:

composer require funkjedi/composer-include-files

然后更新您的composer.json extra字段:

"extra": {
    "include_files": [
        "app/Http/helpers.php"
    ]
}