简短的问题,我想测试一下这个方法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
轻松运行复数实例。
答案 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或其他任何东西)与测试无关。