Мы столкнулись с проблемой в Laravel 4.2, где наш /start/global.php
загружается / выполняется после некоторого ServiceProvider. В нашем ServiceProvider public function register()
и public function boot()
вызываются до /start/global.php
загрузки / выполнения. Это происходит только при запуске наших тестов приложений через phpUnit. Если мы запустим наше приложение через браузер на нашем сервере, последовательность загрузки будет правильной.
TestCase.php:
namespace app\tests\base;
class TestCase extends \Illuminate\Foundation\Testing\TestCase {
/**
* Creates the application.
*
* @return \Symfony\Component\HttpKernel\HttpKernelInterface
*/
public function createApplication()
{
$unitTesting = true;
$testEnvironment = 'testing';
return require __DIR__ . '/../../../bootstrap/start.php';
}
}
phpunit.xml
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
bootstrap="bootstrap/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false">
<testsuites>
<testsuite name="Application Test Suite">
<directory>./app/tests/base/</directory>
</testsuite>
</testsuites>
</phpunit>
Мы углубились в коды и обнаружили, что $app->booted()
в vendor/laravel/framework/src/Illuminate/Foundation/start.php
выполняется после public function register()
и public function boot()
(ServiceProvider).
Как мы можем заставить среду тестирования правильно загружать наше приложение? - Также см .: https://laravel.com/docs/4.2/lifecycle