我有一个奇怪的情况,如果我运行一个单独的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 }
我很确定这将成为那些面对掌心的时刻之一,所以请对我温柔!
答案 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_id
为nil
。运行套件时,Company.current_id
为2
。这是使用默认范围时发生的情况。要修复它,我只需在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