PHPUnit 测试:写入/从 Memcached 检索的问题

Posted

技术标签:

【中文标题】PHPUnit 测试:写入/从 Memcached 检索的问题【英文标题】:PHPUnit Test: issue with write into / retrieve from Memcached 【发布时间】:2021-12-26 17:33:54 【问题描述】:

我使用 Laravel 6.20.31 版,在我的 phpUnit 测试中我无法使用 Memcached 存储或检索数据。

我在 phpunit.xml 中将 CACHE_DRIVER 更新为“memcached”:

...snip...
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="CACHE_DRIVER" value="memcached"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    <php>

在我的 PHPUnit 测试中:

Cache::store('memcached')->put('foo', 'bar');
\Log::debug(cache()->getMemcached()->getAllKeys()); // should return an array with all keys stored in Memcached but array is empty

在 PHPUnit 测试中不能使用 Memcached 吗? 还是我必须正确配置它?

更新:

dd(config('cache.stores.memcached') 返回

.^ array:5 [
  "driver" => "memcached"
  "persistent_id" => "bbsip"
  "sasl" => array:2 [
    0 => null
    1 => null
  ]
  "options" => []
  "servers" => array:1 [
    0 => array:3 [
      "host" => "127.0.0.1"
      "port" => "11211"
      "weight" => 100
    ]
  ]
]

我的配置/cache.php

...snip...
        'memcached' => [
            'driver' => 'memcached',
            'persistent_id' => env('MEMCACHED_PERSISTENT_ID'),
            'sasl' => [
                env('MEMCACHED_USERNAME'),
                env('MEMCACHED_PASSWORD'),
            ],
            'options' => [
                // Memcached::OPT_CONNECT_TIMEOUT  => 2000,
            ],
            'servers' => [
                [
                    'host' => env('MEMCACHED_HOST', '127.0.0.1'),
                    'port' => env('MEMCACHED_PORT', 11211),
                    'weight' => 100,
                ],
            ],
        ],

更新 2: 我想在 PHPUnit 中专门使用 Memcached,因为测试应该涵盖在 Memcached 中存储数据的功能(在应用程序中 Memcached 工作得很好)。

【问题讨论】:

如果你尝试转储 (dd(config('cache.memcached')),你会得到什么?看到这是[原始配置] (github.com/laravel/laravel/blob/…),那些ENV 是在测试运行时填充的吗? @matiaslauriti dd(config('cache.memcached'));返回空值。我必须专门为 PHPUnit 配置它吗?如何?在应用程序上下文中,Memcached 工作得非常好。 对不起,正确的配置是config('cache.stores.memcached'),我的错!也可以快速更新:无论您使用的是 Memcached、Redis 还是数据库,它都可以工作,因为您只需选择一个驱动程序,您不必测试 memcache 是否工作(您应该使用CACHE_DRIVER=array,因为您在运行测试时甚至不需要服务),在这种情况下您正在测试框架(测试 Cache 外观或 cache 助手按预期工作并且已经由框架测试)... 没问题,我用返回值更新了我的帖子(不是空数组)。感谢您帮我调试! 再次查看我的评论,我已经更新了评论,但我认为您没有看到更新。您不需要“测试”缓存,因为这是一个框架/驱动程序问题(它已经过测试并且可以工作)。 【参考方案1】:

出于某种原因使用缓存助手之类的

cache()->getMemcached()->getAllKeys();

返回空数组但像这样的静态方法

Cache::store('memcached')->get('foo'));

按预期工作并返回键“foo”的值。

【讨论】:

以上是关于PHPUnit 测试:写入/从 Memcached 检索的问题的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义框架从目录运行 PHPUnit 测试

如何从 PHPUnit 测试设置运行 Laravel 数据库播种机?

如何让 phpunit 从文件夹中的所有文件运行测试?

PHPUnit测试失败

PHPUnit 接收系统日志消息?

基于 Laravel 开发博客应用系列 —— 从测试开始:创建项目和PHPUnit