如何模拟Rails.cache.fetch的nil案例?

问题描述 投票:0回答:3

考虑一下用法

Rails.cache.fetch("key", expires_in: 2.minutes) do
  do_something_to_get_value
end

我想用自定义对象模拟

class FakeRedis
  def initialize() @data = {} end
  def clear() @data = {} end
  def write(key, val, *args) @data[key] = val end
  def read(key, *args) @data[key] end
  def expire(key, *args) @data.delete(key) end
  def fetch(key, *args) @data[key] end
end

对于nilkey过期或从不存在)的情况,如何重写fetch以后调用代码块并保存到@data

ruby-on-rails rspec
3个回答
1
投票
def fetch(key, *args)
  return(@data[key]) if @data.kas_key?(key)
  @data[key] = yield if block_given?
end

yield是一个执行块的方法。


1
投票

碰巧ruby Hash有一个很好的fetch方法几乎相同,除了你必须在块中显式设置键:

class FakeRedis
  def fetch(key, *, &block)
    if block
      @data.fetch(key) { |h, k| h[k] = block.call }
    else
      @data[key]
    end
  end
end

0
投票

用这种方式重写:

def fetch(key, *args) @data[key] ||= yield if block_given? end

© www.soinside.com 2019 - 2024. All rights reserved.