db记录保存在控制器中并在集成规范

时间:2016-05-01 21:33:59

标签: ruby-on-rails rspec

以下是Rails 4.2引擎中用于我们规范的宝石。

  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'  

以下是创建订单记录的集成规范:

  visit multi_item_orderx.orders_path(customer_id: @kustomer.id)
  click_link 'New Cob Order'
  expect(page).to have_content('New Order')
  fill_in 'order_order_date', :with => 10.days.ago
  fill_in 'order_order_total', :with => 50
  fill_in 'order_cob_info_bonding_product', :with => 'a bonding prod'
  fill_in 'order_cob_info_name', :with => 'storage'
  fill_in 'order_cob_info_qty', :with => 10
  fill_in 'order_cob_info_unit_price', :with => 10
  click_button 'Save'
  expect(CobOrderx::CobInfo.count).to eq(1)

问题在于CobOrderx::CobInfo.count returns 0而不是1。在调试中,@order已成功保存,CobOrderx::CobInfo.count将返回1

但回到规范中:

expect(CobOrderx::CobInfo.count).to eq(1)

返回false,因为.count0。我们尝试在rails_helper中设置以下内容,但它不起作用:

config.use_transactional_fixtures = false

问题似乎与规范(水豚)有关,我们不确定原因。什么可能导致db记录在集成测试中丢失?

1 个答案:

答案 0 :(得分:2)

未能在capybara中搜索已创建记录的最可能原因是工厂女孩或对db的直接访问使用与capybara不同的连接,因此在一个会话中创建的数据在另一个会话中不可用。要解决此问题,请使用single connection patch(将其设置为规范/支持):

require 'active_record'

class ActiveRecord::Base
   mattr_accessor :shared_connection
   @@shared_connection = nil

   def self.connection
      @@shared_connection ||= retrieve_connection
   end
end

不要忘记将其纳入 rails_helper.rb

如果它无法帮助您,您可以尝试在有关该主题的其他讨论中找到答案,该讨论可用here