8

在我们的许多类中,我们缓存昂贵的操作以提高性能。例如

def self.foo
    @foo ||= get_foo
end 

这在应用程序中效果很好,但是测试(RSpec)由于这些记忆变量而失败。当我们期望新值时,将在后续测试中返回第一个测试的值。

所以问题是:我如何重新加载课程?或者删除所有记忆变量?

4

2 回答 2

7

after(or before) 块添加到示例组以删除实例变量(假设有问题的对象是主题):

after do
  subject.instance_variable_set(:@foo, nil)
end

或者解决问题。拥有一个记忆化的类实例变量有点味道,因为它永远不会改变。普通实例变量不会有这个问题,因为您会为每个测试创建一个新对象。

于 2012-07-13T02:10:41.317 回答
5

以缓存数据保持正确或在无效时被删除的方式构建您的类和测试。before考虑添加一个方法来清除缓存并在 rspec块中调用它。

于 2012-07-13T02:13:02.220 回答