2012-07-13 41 views
4

在我们的许多类中,我们缓存昂贵的性能操作。例如如何重新加载红宝石类

def self.foo 
    @foo ||= get_foo 
end 

这适用于应用程序,但测试(RSpec)由于这些memoized变量而失败。当我们预计新值时,第一次测试的值将在随后的测试中返回。

所以问题是:如何重新加载类?或者删除所有memoized变量?

回答

2

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

+0

是的,我认为这是最好的方法和更干净的解决方案。谢谢 – Sebastian 2012-07-13 02:46:58

6

一个after(或before)块添加到示例组以除去实例变量(假设所讨论的对象是对象):

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

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

+0

谢谢,我想这也会起作用,但是与其他解决方案相同的问题,这会使测试维护变得困难,因为您需要明确地取消设置变量 – Sebastian 2012-07-13 02:16:22

+0

是的,我倾向于不首先进行记忆。 – Sebastian 2012-07-13 02:22:27

+0

是的。作为一般指导原则:如果很难纠正你的测试,那真的是测试过的代码是错误的。 – 2012-07-13 02:48:51