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

时间:2018-06-15 08:05:07

标签: ruby multithreading testing rspec

简短的问题,我想测试一下这个方法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 个答案:

答案 0 :(得分:1)

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

=textjoin(", ", true, c28:c30)

您还可以设置在这种情况下根本不运行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的事实(就像它位于PostgreSQL数据库中,或Redis或其他任何东西)与测试无关。