如何重新加载ruby类

Seb*_*ian 7 ruby rspec

在我们的许多类中,我们缓存了昂贵的性能操作.例如

def self.foo
    @foo ||= get_foo
end 
Run Code Online (Sandbox Code Playgroud)

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

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

And*_*all 7

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

after do
  subject.instance_variable_set(:@foo, nil)
end
Run Code Online (Sandbox Code Playgroud)

或者解决问题.拥有一个memoized类实例变量有点气味,因为它永远不会改变.由于您要为每个测试创建一个新对象,因此普通实例变量不会出现此问题.


Dav*_*son 5

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