Ruby 为什么类实例变量跨规范持久化?

Ruby 为什么类实例变量跨规范持久化?,ruby,rspec,Ruby,Rspec,我使用类实例变量来跟踪@instances。当我单独运行每个规范时,它们通过。但当我一起跑的时候,会有意想不到的行为 it "returns 1" do mock = Mock.new expect(Mock.count).to eq(1) end it "returns 2" do mock = Mock.new mock = Mock.new expect(Mock.count).to eq(2) end 当我单独运行其中一个时,所有规格都是绿色的。但当我同时运行这两

我使用类实例变量来跟踪@instances。当我单独运行每个规范时,它们通过。但当我一起跑的时候,会有意想不到的行为

it "returns 1" do
  mock = Mock.new
  expect(Mock.count).to eq(1)
end

it "returns 2" do
  mock = Mock.new
  mock = Mock.new
  expect(Mock.count).to eq(2)
end

当我单独运行其中一个时,所有规格都是绿色的。但当我同时运行这两个时,第二个规范返回的计数为3。因此,我看到Mock在不同的规范中一直存在。我使用的是纯ruby,没有DB或rails或任何东西。

这就是类实例变量所做的。它们是类本身的状态,通常会在应用程序的整个生命周期(或者在您的情况下运行测试套件)中持续存在。

这就是类实例变量所做的。。它们是类本身的状态,通常会在应用程序的整个生命周期内持续存在(或者在您的情况下运行测试套件)。

我找到了一个解决方案

before do
  @Mock = Class.new.include(IDable)
end
然后每次使用@Mock时,它都会有新的类实例变量

我找到了解决办法

before do
  @Mock = Class.new.include(IDable)
end

然后每次使用@Mock时,它都会有新的类实例变量

有没有办法绕过这个问题?我知道类实例变量就是这样做的,但我希望每个规范都能独立运行,就像以前没有运行过其他代码一样。@thesimpledev好吧,对你来说没有隔离,但是你可以在
之前的
块中重设类级缓存:每个
块你到底是怎么做的?有什么办法绕过这个问题的吗?我知道类实例变量就是这样做的,但我希望每个规范都能独立运行,就像以前没有运行过其他代码一样。@thesimpledev好吧,对你来说没有隔离,但是你可以在
之前的
块中重设类级缓存:每个
块你到底是怎么做的?这是一个解决方案,好吧。但这是好的吗?这是有争议的。如果对你有用,我完全赞成。但我不愿意在我的代码中使用它。看起来像是在掩盖问题。¯\_(ツ)_/那么,你会考虑一个更好的解决方案吗?我很想听到这个消息!不知道你想解决的问题,我会在前一个块中进行清除/重置状态(如其他评论中提到的)。这是一个解决方案,好吧。但这是一个好的解决方案吗?这是有争议的。如果它对你有效,我完全赞成。但我会犹豫在我的代码中使用它。看起来像是在掩盖问题。”\_(ツ)_/那么,你会考虑一个更好的解决方案吗?我很想听到这个消息!不知道你想解决的问题,我会在前一个块中进行清除/重置状态(如其他评论中提到的)。