ruby-on-rails - 使用 redis 进行易碎测试
问题描述
我有一个用于在 redis 中缓存 API 密钥的单元测试(在 rails 应用程序中)。
redis 使用gem设置为全局变量 ( $redis
) 。所以我确实得到了redis连接。connection_pool
$redis.with do |redis|
问题是,我的测试非常不稳定。它有两个断言:一个用于测试获取预期值,另一个用于测试该值是否被缓存(10 分钟)。
jwt = JWT.encode payload, private_key, "RS256"
assert_equal jwt, Foo.app_token
travel 5.minutes
assert_equal jwt, Foo.app_token
我无法弄清楚为什么测试如此不稳定。它可能每运行 3-5 次就会失败。任何帮助将不胜感激。我从来没有真正在连接池中使用过 redis,所以很可能是在做一些基本的错误。
方法的实现:
def app_token
find_app_token || create_app_token
end
private
def find_app_token
$redis.with { |redis| redis.get APP_KEY }
end
def create_app_token
payload = # some payload
JWT.encode(payload, private_key, "RS256").tap do |jwt|
$redis.with do |redis|
redis.set APP_KEY, jwt
redis.expireat APP_KEY, payload[:exp]
end
end
end
解决方案
在这里将其作为答案提出以提高知名度。
travel 5.minutes
存根 theTime.now
和其他相关方法以按所需的持续时间增加/减少时间。存根在测试结束时被移除。我认为他们的意思是在整个测试套件执行结束时。这可能是片状测试的可能原因。
travel
还提供了一个选项来提供一个块,然后重置存根。因此,像
travel 5.minutes do
assert_equal jwt, Foo.app_token
end
可能是一种更合适的方法,因为它会在检查所需的断言后立即删除存根。更多信息: https ://api.rubyonrails.org/v6.0.0/classes/ActiveSupport/Testing/TimeHelpers.html#method-i-travel
推荐阅读
- javascript - 突出显示活跃的“药丸”
- c# - 使用 C# 更新 JSON 文件中存在的特定项目
- c - 试图让 UART 在 dsPIC33EV256GM102 上工作
- c# - 在服务器上处理的小型 API 调用与存储在内存中的大型数据拉取
- pytorch - PyTorch 错误张量 a (128) 的大小必须与非单维 0 处的张量 b (9) 的大小相匹配
- xcode - 是否有一个键盘快捷键可以在 Xcode 中最近访问的两个选项卡之间切换?
- angular - 如果我使用此代码是否可以安全地抵御 XSS 攻击?
- java - 清除文件后如何继续写入文件?
- mysql - 连接具有非同质属性的四个视图表时出错
- php - 从 Web 应用程序将文档添加到 Marklogic 中的集合