2011-12-04 170 views
9

我有一些用RSpec编写的测试各种模型的规格。我使用Factory Girl来生成测试对象。rspec测试通过隔离,但在与其他测试运行时失败

现在最奇怪的事情发生了:
当我运行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

让我们看看错误。 –

+0

添加了该错误。 – ErwinM

+0

谢谢。和你的工厂代码? –

回答

11

这通常表示您的其他规格会在数据库中留下与后来的工厂调用冲突的一些数据。我怀疑如果你仔细研究工厂创建方法失败的原因,你会看到唯一性验证失败,也许在客户的电子邮件中。

关闭交易灯具:

# spec_helper.rb 
config.use_transactional_fixtures = false 

,并使用database cleaner来代替。 This blog post也可能有帮助。

+0

这个问题最终导致数据丢失。不在数据库中,但在插件的全局变量中。 – ErwinM

+3

你是如何找到这个全局变量的? –

+0

@Thilo你链接到的博客文章已消失。 – jottr

5

RSpec现在有一个"bisect" feature专为寻找这类问题而设计。

使用--bisect标志运行导致故障的RSpec命令,RSpec将自动识别哪个规格组合导致该故障。

rspec spec/models --bisect 
+0

你是一个拯救生命的人:) – Uzair

相关问题