У меня есть модульный тест для кэширования ключа API в redis (в приложении rails).
redis установлен в глобальную переменную ($redis
) с connection_pool
gem .Поэтому я делаю $redis.with do |redis|
, чтобы на самом деле получить соединение с 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