rspec测试单独传递,但在使用其他测试运行时失败

Erw*_*inM 14 rspec ruby-on-rails-3 factory-bot

我有一些用RSpec编写的规范测试各种模型.我使用Factory Girl生成测试对象.

现在最奇怪的事情发生了:
当我运行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)>'
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

Tob*_*hen 19

RSpec现在有一个"bisect"功能,专门用于发现此类问题.

使用--bisect标志运行导致失败的RSpec命令,RSpec将自动识别导致该失败的规范组合.

rspec spec/models --bisect
Run Code Online (Sandbox Code Playgroud)


Thi*_*ilo 13

这通常表明您的其他规范会在数据库中留下一些与以后的工厂调用冲突的数据.我怀疑如果你看看为什么工厂创建方法失败,你会看到唯一性验证失败,也许在客户的电子邮件中.

关闭交易设备:

# spec_helper.rb
config.use_transactional_fixtures = false
Run Code Online (Sandbox Code Playgroud)

并使用数据库清理器.这篇博文也可能有所帮助.

  • 你是怎么找到这个全局变量的? (3认同)