我有一些用RSpec编写的规范测试各种模型。我使用Factory Girl生成测试对象。</ p>
现在最奇怪的事情发生了:
当我运行rspec spec/models/specific_model_spec.rb
---这会通过该规范中的所有测试
但是,当我运行rspec spec/models
时 - 此规范中的每个测试都无法引用创建的无效关联(通过工厂)
工厂创建的关联显然是有效的,因为单独运行测试也会显示。
可能导致此行为的原因是什么?
更新
运行规范和其他规范时出现的错误(每次失败的错误都相同):
6) StreamItem adds a stream_item to a project and consultant when an engagement is added
Failure/Error: @project = Factory.create(:project, :name => 'bar' )
Validation failed: Customer is invalid
# ./spec/models/stream_item_spec.rb:44:in `block (2 levels) in <top (required)>'
project factory
在另一个规范中进行测试,并且通过正常......
更新2: 使用的相关工厂代码如下:
Factory.define :manager, :class => User do |f|
f.sequence(:email) { |n| "bar#{n}@example.com" }
f.password "pass12"
f.sequence(:name) { |n| "Erwin#{n}" }
f.roles_mask 4
end
Factory.define :customer do |f|
f.sequence(:name) { |n| "foo customer#{n}" }
f.association :last_actor, :factory => :manager
f.account_id 1
end
Factory.define :project do |f|
f.sequence(:name) { |n| "foo project#{n}" }
f.association :manager, :factory => :manager
f.association :customer, :factory => :customer
f.start_date Date.today << 1
f.finish_date Date.today >> 2
f.status 1
f.association :last_actor, :factory => :manager
f.account_id 1
end
答案 0 :(得分:17)
RSpec现在有"bisect" feature专门设计用于发现此类问题。
使用--bisect
标志运行导致失败的RSpec命令,RSpec将自动识别哪种规格组合导致失败。
rspec spec/models --bisect
答案 1 :(得分:13)
这通常表明您的其他规范会在数据库中留下一些与以后的工厂调用冲突的数据。我怀疑如果你研究工厂创建方法失败的原因,你会看到对唯一性的验证失败,可能在客户的电子邮件中。
关闭交易设备:
# spec_helper.rb
config.use_transactional_fixtures = false
并改为使用database cleaner。 This blog post也可能会有所帮助。