更新到 Laravel 5.4 时,PHPUnit 出错但应用程序不出错
Error in PHPUnit but not in app when updating to Laravel 5.4
我正在从 Laravel 5.3 更新到 5.4
我的作曲家更新工作正常,而且我的应用程序似乎没问题。
但是当我 运行 使用 PHPUnit 进行测试时,所有测试都失败了。
编辑:
现在,根据 patricus 的回应,我安装了 browser-kit-testing 并制作了文档所需的所有内容。
问题仍在发生...
这是新的堆栈:
TypeError: Argument 1 passed to Illuminate\Auth\SessionGuard::setRequest() must be an instance of Symfony\Component\HttpFoundation\Request, null given, called in /laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 139
/laravel/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php:768
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:139
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:96
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:70
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:294
/laravel/vendor/sentry/sentry-laravel/src/Sentry/SentryLaravel/SentryLaravelServiceProvider.php:83
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:678
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:565
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:702
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:105
/laravel/vendor/sentry/sentry-laravel/src/Sentry/SentryLaravel/SentryLaravelServiceProvider.php:45
/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:28
/laravel/vendor/laravel/framework/src/Illuminate/Support/helpers.php:912
/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:86
/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:30
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:524
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:762
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:745
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:746
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php:17
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:208
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:160
/laravel/tests/BrowserKitTest.php:24
/laravel/vendor/laravel/browser-kit-testing/src/TestCase.php:95
/laravel/vendor/laravel/browser-kit-testing/src/TestCase.php:70
/laravel/tests/functional/RoundRobinTreeTest.php:22
这是我的 RoundRobinTest:
class RoundRobinTreeTest extends BrowserKitTest
{
....
}
在我的测试文件夹中,我将旧的 TestCase.php 复制到 BrowserKitTest.php
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;
abstract class BrowserKitTest extends BaseTestCase
{
....
}
Laravel 5.4 更新了它使用的测试框架。 Laravel 5.4 使用 Laravel Dusk,而 Laravel 5.3 使用 Symfony 的 browserkit 组件。
Laravel 5.3 browserkit 测试功能被提取到它自己的包中(laravel/browser-kit-testing), so that you can require the package and have your 5.3 tests work in 5.4. The upgrade instructions 在 Laravel 的文档中解释更多。
基本上,拉入 laravel/browser-kit-testing
包,并更改您的 TestCase
文件以扩展 Laravel\BrowserKitTesting\TestCase
,您的测试应该像在 5.3 中一样工作。
编辑
据我所知,你用错了 Kernel
。
在您的堆栈跟踪中,Illuminate/Auth/AuthManager.php:139
是这一行:
$guard->setRequest($this->app->refresh('request', $guard, 'setRequest'));
这意味着 $this->app->refresh('request', $guard, 'setRequest')
是 returning null(根据您的错误消息 "null given")。 $this->app->refresh()
在刷新的项目('request'
)还没有绑定时return为null
早些时候在您的堆栈跟踪中显示您的 tests/BrowserKitTest.php
文件正在 Illuminate\Foundation\Http\Kernel
上调用 bootstrap()
。问题在于 Http 内核的引导程序中没有任何内容绑定 'request'
实例。
您应该在 Illuminate\Foundation\Console\Kernel
上调用 bootstrap()
,因为它的引导程序之一是 Illuminate\Foundation\Bootstrap\SetRequestForConsole
,它确实为 'request'
实例提供了绑定。
另外,Console内核是Laravel提供的原始TestCase
文件指定的内核。
我正在从 Laravel 5.3 更新到 5.4
我的作曲家更新工作正常,而且我的应用程序似乎没问题。
但是当我 运行 使用 PHPUnit 进行测试时,所有测试都失败了。
编辑:
现在,根据 patricus 的回应,我安装了 browser-kit-testing 并制作了文档所需的所有内容。
问题仍在发生...
这是新的堆栈:
TypeError: Argument 1 passed to Illuminate\Auth\SessionGuard::setRequest() must be an instance of Symfony\Component\HttpFoundation\Request, null given, called in /laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php on line 139
/laravel/vendor/laravel/framework/src/Illuminate/Auth/SessionGuard.php:768
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:139
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:96
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:70
/laravel/vendor/laravel/framework/src/Illuminate/Auth/AuthManager.php:294
/laravel/vendor/sentry/sentry-laravel/src/Sentry/SentryLaravel/SentryLaravelServiceProvider.php:83
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:678
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:565
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:702
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:105
/laravel/vendor/sentry/sentry-laravel/src/Sentry/SentryLaravel/SentryLaravelServiceProvider.php:45
/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:28
/laravel/vendor/laravel/framework/src/Illuminate/Support/helpers.php:912
/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:86
/laravel/vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php:30
/laravel/vendor/laravel/framework/src/Illuminate/Container/Container.php:524
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:762
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:745
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:746
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Bootstrap/BootProviders.php:17
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:208
/laravel/vendor/laravel/framework/src/Illuminate/Foundation/Http/Kernel.php:160
/laravel/tests/BrowserKitTest.php:24
/laravel/vendor/laravel/browser-kit-testing/src/TestCase.php:95
/laravel/vendor/laravel/browser-kit-testing/src/TestCase.php:70
/laravel/tests/functional/RoundRobinTreeTest.php:22
这是我的 RoundRobinTest:
class RoundRobinTreeTest extends BrowserKitTest
{
....
}
在我的测试文件夹中,我将旧的 TestCase.php 复制到 BrowserKitTest.php
use Laravel\BrowserKitTesting\TestCase as BaseTestCase;
abstract class BrowserKitTest extends BaseTestCase
{
....
}
Laravel 5.4 更新了它使用的测试框架。 Laravel 5.4 使用 Laravel Dusk,而 Laravel 5.3 使用 Symfony 的 browserkit 组件。
Laravel 5.3 browserkit 测试功能被提取到它自己的包中(laravel/browser-kit-testing), so that you can require the package and have your 5.3 tests work in 5.4. The upgrade instructions 在 Laravel 的文档中解释更多。
基本上,拉入 laravel/browser-kit-testing
包,并更改您的 TestCase
文件以扩展 Laravel\BrowserKitTesting\TestCase
,您的测试应该像在 5.3 中一样工作。
编辑
据我所知,你用错了 Kernel
。
在您的堆栈跟踪中,Illuminate/Auth/AuthManager.php:139
是这一行:
$guard->setRequest($this->app->refresh('request', $guard, 'setRequest'));
这意味着 $this->app->refresh('request', $guard, 'setRequest')
是 returning null(根据您的错误消息 "null given")。 $this->app->refresh()
在刷新的项目('request'
)还没有绑定时return为null
早些时候在您的堆栈跟踪中显示您的 tests/BrowserKitTest.php
文件正在 Illuminate\Foundation\Http\Kernel
上调用 bootstrap()
。问题在于 Http 内核的引导程序中没有任何内容绑定 'request'
实例。
您应该在 Illuminate\Foundation\Console\Kernel
上调用 bootstrap()
,因为它的引导程序之一是 Illuminate\Foundation\Bootstrap\SetRequestForConsole
,它确实为 'request'
实例提供了绑定。
另外,Console内核是Laravel提供的原始TestCase
文件指定的内核。