如何在 Laravel 的 PHPUnit 中启用 Redis 连接

Posted

技术标签:

【中文标题】如何在 Laravel 的 PHPUnit 中启用 Redis 连接【英文标题】:How to enable Redis connection in PHPUnit in Laravel 【发布时间】:2021-06-14 14:46:09 【问题描述】:

我有一个使用 mysql 作为其主数据库的 Laravel 应用程序,我还在某些部分使用了一些 redis 连接以更快地加载数据。

目前我正在 laravel 中使用 phpunit 创建单元测试。但是,我尝试创建单元测试的方法具有 redis 连接 - Redis::connection()。预期的断言应该是 200 响应,但由于该 redis 连接,它返回 500 响应。如何在 php 单元上启用 redis,以便为它创建单元测试?

我当前的phpunit.xml 配置如下:

<php>
   <server name="APP_ENV" value="testing"/>
   <server name="BCRYPT_ROUNDS" value="4"/>
   <server name="CACHE_DRIVER" value="array"/>
   <server name="DB_CONNECTION" value="mysql"/>
   <server name="DB_DATABASE" value="MY_DB_NAME"/>
   <server name="MAIL_MAILER" value="array"/>
   <server name="QUEUE_CONNECTION" value="sync"/>
   <server name="SESSION_DRIVER" value="array"/>
</php>

这是错误日志:

[2021-03-29 12:12:53] testing.ERROR: Please make sure the PHP Redis extension is installed and enabled. "userId":84,"exception":"[object] (LogicException(code: 0): Please make sure the PHP Redis extension is installed and enabled. at /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php:77)
[stacktrace]
#0 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Support/helpers.php(433): Illuminate\\Redis\\Connectors\\PhpRedisConnector->Illuminate\\Redis\\Connectors\\closure(Object(Illuminate\\Support\\Facades\\Redis))
#1 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php(105): tap(Object(Illuminate\\Support\\Facades\\Redis), Object(Closure))
#2 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php(28): Illuminate\\Redis\\Connectors\\PhpRedisConnector->createClient(Array)
#3 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Redis/Connectors/PhpRedisConnector.php(32): Illuminate\\Redis\\Connectors\\PhpRedisConnector->Illuminate\\Redis\\Connectors\\closure()
#4 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(110): Illuminate\\Redis\\Connectors\\PhpRedisConnector->connect(Array, Array)
#5 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Redis/RedisManager.php(90): Illuminate\\Redis\\RedisManager->resolve('default')
#6 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(261): Illuminate\\Redis\\RedisManager->connection()
#7 /home/johndoe/bo2-dev/app/Http/Controllers/DataContentOfficerController.php(419): Illuminate\\Support\\Facades\\Facade::__callStatic('connection', Array)
#8 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Routing/Controller.php(54): App\\Http\\Controllers\\DataContentOfficerController->manual_qc_confirm()
#9 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Routing/ControllerDispatcher.php(45): Illuminate\\Routing\\Controller->callAction('manual_qc_confi...', Array)
#10 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Routing/Route.php(239): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(App\\Http\\Controllers\\DataContentOfficerController), 'manual_qc_confi...')
#11 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Routing/Route.php(196): Illuminate\\Routing\\Route->runController()
#12 /home/johndoe/bo2-dev/vendor/laravel/framework/src/Illuminate/Routing/Router.php(685): Illuminate\\Routing\\Route->run()
...

【问题讨论】:

由于您的 phpunit.xml 中没有 redis 配置,它将使用来自 config/cache.php 的默认配置,因此请确保它也是正确的。 @apokryfos 在 config/cache.php 下面是redis config..'redis' =&gt; ['driver' =&gt; 'redis','connection' =&gt; 'cache'], 对吗? 糟糕。我忘了他们前段时间搬了这个。它现在位于config/databases.phpredis。我想默认使用的连接是default 啊,是的,它已根据其 .env 值正确配置 .env 值是否已读取?我以为他们不赞成 phpunit.xml 价值观 【参考方案1】:

如果您的本地(.env 工作)您应该创建一个.env.testing 并使用--env=testing 选项进行PHPUnit 测试,就像在docs 中所说的那样。

【讨论】:

是的,我已经这样做了。但是redis仍然无法正常工作 我从日志中看到错误“请确保已安装并启用 PHP Redis 扩展”。你应该在这个[问题](***.com/questions/61168156/…)上关注这个问题

以上是关于如何在 Laravel 的 PHPUnit 中启用 Redis 连接的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.5 中运行 phpunit

如何在Laravel项目中安装PHPunit

如何在 PHPUnit / Laravel 中模拟 JSON 文件

在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型

如何在 PHPUnit 中控制台/检查 Laravel 资源的 JSON 响应?

如何在 laravel 5.5 中使用 phpunit 测试中间件?