代码之家  ›  专栏  ›  技术社区  ›  Ulysse BN

测试缓存(多处理)和存储方法

  •  1
  • Ulysse BN  · 技术社区  · 6 年前

    简短的问题,我想测试一下这个方法 foo :

    class MyClass
        def foo
            # The `@cache_key` is defined by instance but can be the same for
            # different instances (obviously I guess)
            @foo ||= cache.fetch(@cache_key) do
                # call a private method, tested aside
                generate_foo_value || return
                # The `|| return` trick is one I use to skip the yield result
                # in case of falsey value. May not be related to the question,
                # but I left it there because I'm not so sure.
            end
       end
    end
    

    这里的问题是我有两种缓存。

    一方面,我有 @foo ||= 这保证了记忆,而且我可以很容易地测试。例如,调用两次我的方法并观察结果是否不同。

    另一方面,我有 cache.fetch 方法,可以在不同实例之间共享。我的麻烦就在这里:我不知道最好的方法 单元 测试它。我应该嘲笑我的缓存吗?我应该看缓存结果吗?还是应该使用相同的缓存密钥运行多个实例?

    对于最后一个问题,我不知道如何使用 rspec

    1 回复  |  直到 6 年前
        1
  •  1
  •   Greg    6 年前

    我认为在这种情况下你不需要多个例子。看起来您可以在规范中设置缓存值,并测试myClass实例是否正在返回它。

    before { cache.set(:cache_key, 'this is from cache') }
    subject { MyClass.new(:cache_key, cache) } # you didn't provide the
                                               # initializer, so I'll just assume
                                               # that you can set the cache key 
                                               # and inject the cache object 
    
    specify do 
      expect(subject.foo).to eq 'this is from cache'
    end
    

    你也可以设定期望值 generate_foo_value 在这种情况下根本不运行。

    我的理由是:不需要在单独的进程中完全模拟设置缓存。仅当设置了带键的缓存时才进行测试-方法必须返回该缓存,而不是执行昂贵的计算。

    事实上这个缓存是 shared 进程之间(比如它位于postgresql db、redis或其他什么地方)与测试无关。