测试整个Rspec套件失败

时间:2011-07-20 17:10:44

标签: ruby-on-rails-3 rspec rspec2

我有一个奇怪的情况,如果我运行一个单独的rspec模型spec文件,所有示例都是绿色的,如果我测试我的整个spec / models文件夹,我的所有示例都是绿色的。如果我测试控制器,它们都会通过绿色。如果我测试整个套件(通过rspec规范)然后我会失败 - 如果我完全删除控制器测试,一切都是绿色的。现在我期待这完全是自己造成的,但我无法理解。

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

例如。如果该行存在,则在notes_controller_spec.rb中

 Note.any_instance.stubs(:valid?).returns(false)

导致我的models / account_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 }

我很确定这将成为那些面对掌心的时刻之一,所以请对我温柔!

3 个答案:

答案 0 :(得分:1)

你是否在之前的所有日期设置?这些不是交易性的,可能导致测试污染问题。

另外,我认为您的语法可能不在此处:

    Note.any_instance.stubs(:valid?).returns(false)

应该是:

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

答案 1 :(得分:0)

我在RSpec 3和Rails 4.1中遇到过类似的问题。每当我自己运行有问题的spec文件时,它就会通过,而运行完整套件会使它失败。

在我的情况下,它与时区有某种关系。我在ApplicationController中明确设置了时区,出于某种原因我的功能规格并不喜欢它。如果我在测试环境中没有设置时区,一切都会再次通过。 e.g。

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

答案 2 :(得分:0)

我遇到了类似的问题:个别型号规格已通过。在运行整个模型套件时,我有大约30次失败。我所做的是在所有失败发生之前查看文件。在那里,我发现我在线程中设置内容并使用default_scopes,就像在railscast中一样。

在之前的一个条款中,我打印了Company.current_id。正如我所想,当单独运行时,Company.current_idnil。运行套件时,Company.current_id2。这是使用默认范围时发生的情况。要修复它,我只需在before子句中将Company.current_id设置为nil

之前

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

describe Service, type: :model do
  before do
    Company.current_id = nil
  end
end