我们正在使用 Rails 4.2.0 运行规范 (3.4.4)。这是规范:
it "returns http success" do
proj = FactoryGirl.create(:ext_construction_projectx_project, :name => 'namenewnew')
get 'new' , {:project_id => proj.id}
expect(response).to be_success
end
在调试中,proj.id
为 3
并且其所有值都是正确的。 ExtConstructionProjectx::Project.find(3)
返回 nil
,ExtConstructionProjectx::Project.count
返回 0
。项目记录就这样消失了。
rspec 是否有可能没有看到在其数据库连接上创建的 project
记录?如何解决这个问题?
更新:
这是 gem 规范
s.add_dependency "rails", ">=4.2.0"
s.add_dependency "jquery-rails"
s.add_dependency "simple_form"
s.add_dependency "will_paginate"
s.add_dependency "database_cleaner"
s.add_dependency "execjs"
s.add_dependency "sass-rails", '~>5.0.1'
s.add_dependency "coffee-rails", '~>4.1.0'
s.add_dependency "uglifier"
s.add_development_dependency "sqlite3"
s.add_development_dependency "rspec-rails", ">= 3.2.0"
s.add_development_dependency "factory_girl_rails", '~>4.5'
s.add_development_dependency 'capybara'
s.add_development_dependency 'launchy'
此外,在rails_spec
中,还有:
config.use_transactional_fixtures = true
最佳答案
这是预期的行为。如果数据库记录在测试调用之间持续存在,您的测试将无法隔离或正确测试每个案例。
如果您不想要当前的行为:
- 考虑删除(或重新配置)
database_cleaner
gem 。 - 在 rspec 配置中设置
config.use_transactional_fixtures = false
。或查看 rspec docs另一种策略。
“更好”的解决方案:
- 重写您的测试,使其不依赖于早期测试运行的状态。
- 考虑在 rspec 测试中使用
before(:each)
和before(:all)
宏。
关于ruby-on-rails - FactoryGirl 生成的记录在 rspec 中消失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37173632/