提问者:小点点

水豚恶作剧与数据库清洁工没有找到FactoryGirl记录


我正在用FactoryGirl编写集成测试并创建记录。当测试有js:true(带Poltergeist)时,我的控制器会抛出RecordNotFound,即使它们是在非js测试(不带Poltergeist)中找到的。

我确实将use\u transactional\u fixture设置为falseDatabaseCleaner。策略设置为:截断,似乎涵盖了这个问题上的所有现有SO问题。我尝试用Selenium(用Firefox)代替Poltergeist,但得到了相同的结果。ETA I使用RSpec Rails 3.3.3、Capybara 2.4.4、Poltergeist 1.6.0、PhantomJS 1.9.8、Database Cleaner 1.4.1启动了一个全新的Rails 4.2.3项目,并在测试新的未经编辑的脚手架时获得了相同的结果。

为什么我的记录没有被恶鬼找到?任何建议都会有帮助,因为我已经做了好几个小时了。

前两个测试通过,而最后一个测试在第二行中失败,RecordNotField

require 'spec_helper'

before :each do
  @vehicle = FactoryGirl.create :vehicle
end

it "should work on vehicle path" do
  visit vehicle_path(@vehicle)
  expect(page).to have_content @vehicle.name
end

describe "with js", js: true do
  it "should work on root path" do
    visit root_path
    expect(page).to have_content "My Root"
  end

  it "should work on vehicle path" do
    expect(Vehicle.find(@vehicle.to_param)).to be_present # no error
    visit vehicle_path(@vehicle) # error: ActiveRecord::RecordNotFound in controller from Vehicle.find (same as above line)
    expect(page).to have_content @vehicle.name
  end
end

这是我的精简规格助手。rb:

require 'rubygems'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'factory_girl_rails'
require 'database_cleaner'
require 'capybara/rails'
require 'capybara/rspec'
require 'capybara/poltergeist' 

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new app, window_size: [1600, 1200], js_errors: false
end

RSpec.configure do |config|
  config.use_transactional_fixtures = false
  config.order = "random"

  Capybara.javascript_driver = :poltergeist
  config.include Capybara::DSL

  config.before(:suite) do
    DatabaseCleaner.clean_with(:truncation) # moving to before :each doesn't help
    DatabaseCleaner.strategy = :truncation # moving to before :each doesn't help
  end

  config.around :each do |example| # refactoring as before/after with .start/.clean doesn't help
    DatabaseCleaner.cleaning { example.run }
  end
end

共1个答案

匿名用户

我创建了一个新的项目,基本上复制了您的设置,它似乎工作得很好--您可以在这里看到-http://github.com/twalpole/demo_truncation-不确定您的设置和尝试新应用的区别是什么