如何在 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' => ['driver' => 'redis','connection' => 'cache'],
对吗?
糟糕。我忘了他们前段时间搬了这个。它现在位于config/databases.php
下redis
。我想默认使用的连接是default
啊,是的,它已根据其 .env 值正确配置
.env
值是否已读取?我以为他们不赞成 phpunit.xml
价值观
【参考方案1】:
如果您的本地(.env
工作)您应该创建一个.env.testing
并使用--env=testing
选项进行PHPUnit 测试,就像在docs 中所说的那样。
【讨论】:
是的,我已经这样做了。但是redis仍然无法正常工作 我从日志中看到错误“请确保已安装并启用 PHP Redis 扩展”。你应该在这个[问题](***.com/questions/61168156/…)上关注这个问题以上是关于如何在 Laravel 的 PHPUnit 中启用 Redis 连接的主要内容,如果未能解决你的问题,请参考以下文章
如何在 PHPUnit / Laravel 中模拟 JSON 文件
在 PHPUnit 中调用路由时如何在 Laravel 8 中模拟 Eloquent 模型