Ruby on rails 3 测试整个Rspec套件失败

Ruby on rails 3 测试整个Rspec套件失败,ruby-on-rails-3,rspec,rspec2,Ruby On Rails 3,Rspec,Rspec2,我有一个奇怪的情况,如果我运行一个单独的rspec模型spec文件,所有示例都是绿色的,如果我测试我的整个spec/models文件夹,所有示例都是绿色的。如果我测试控制器,它们都会通过绿色测试。如果我测试整个套件(通过rspec规范),那么我就会失败——如果我完全移除控制器测试,那么一切都是绿色的。现在我想这完全是我自己造成的,但我就是想不出来 我已经将其缩小到控制器测试中的特定示例,这会导致模型规范中的示例失败 例如,在notes\u controller\u spec.rb中,如果存在此行

我有一个奇怪的情况,如果我运行一个单独的rspec模型spec文件,所有示例都是绿色的,如果我测试我的整个spec/models文件夹,所有示例都是绿色的。如果我测试控制器,它们都会通过绿色测试。如果我测试整个套件(通过rspec规范),那么我就会失败——如果我完全移除控制器测试,那么一切都是绿色的。现在我想这完全是我自己造成的,但我就是想不出来

我已经将其缩小到控制器测试中的特定示例,这会导致模型规范中的示例失败

例如,在notes\u controller\u spec.rb中,如果存在此行

 Note.any_instance.stubs(:valid?).returns(false)
它会导致我的模型/帐户\u spec.rb出现故障

Failure/Error: @account.all_notes.should have(2).notes
ArgumentError:
comparison of Note with Note failed
./app/models/account.rb:293:in `sort'
第293行的位置

 (self.notes + self.transactions.map(&:notes).flatten).sort {|a,b| a.created_at <=> b.created_at }
(self.notes+self.transactions.map(&:notes).flatten).sort{a,b | a.created_at b.created_at}

我很确定这将是一个面部手掌的时刻,所以对我温柔点

您是否在before:all块中进行日期设置?这些不是事务性的,可能会导致测试污染问题

此外,我认为您的语法可能不正确:

    Note.any_instance.stubs(:valid?).returns(false)
应该是:

    Note.any_instance.stub(:valid?).and_return(false)

我在RSpec3和Rails4.1中也遇到过类似的问题。每当我单独运行有问题的spec文件时,它都会通过,而运行完整的套件会使它失败

就我而言,它与时区有某种联系。我在ApplicationController中明确设置了时区,出于某种原因,我的功能规格不喜欢它。如果我在测试环境中不设置时区,一切都会再次通过。e、 g

unless Rails.env.test?
  Time.zone = "some timezone value here"
end

我遇到了一个类似的问题:个别型号规格通过了。在运行整个模型套件时,我遇到了大约30次故障。我所做的是在所有故障发生之前查看文件。在那里,我发现我在线程中设置了一些东西,并使用了像这样的默认范围

在before子句中,我打印了
Company.current\u id
。正如我所想,当单独运行时,
Company.current\u id
nil
。运行套件时,
Company.current\u id
2
。这就是使用默认作用域时发生的情况。为了解决这个问题,我在before子句中将Company.current\u id设置为
nil

以前

describe Service, type: :model do
  before do
  end
end
之后


在处创建的对于其中一个注释可能是
nil
,这意味着您的排序块将把
nil
Fixnum
进行比较,这将导致该块返回
nil
,这将使排序与您看到的
ArgumentError
进行放大。您确定此行运行时所有实例都已保存在数据库中吗?您的数据库是否可能在每个示例之前都没有清空?我有一个类似的问题。我有一种感觉,它可能与此有关,尽管它声称已被修复。抱歉,我无意中按了enter,更详细:我正在对模型的任何实例存根一个方法-一个与我在特定测试集中测试的模型不同的模型。当我运行另一组需要该方法的测试时,找不到它。在一个文件中取出测试中的存根会使另一个文件通过。真烦人。我一直在尝试安装不同版本的rspec。以下是我问题的要点:stubing是在
之前的:all
块中完成的吗?这可能会导致该方法存在问题。只是猜测而已。
describe Service, type: :model do
  before do
    Company.current_id = nil
  end
end