2
votes

I tried to follow José Valim's advice on faster test suites, but to no avail. I use Spork and put the AR monkey patch in the Spork.each_run block (see the spec helper below).

However, my request specs fail because the database is not cleaned between runs - specifically, I get errors such as expected 1 record, got X when doing assertions like Model.should have(1).record.

Update The problem lies with request specs using Javascript. See the following spec - it fails when I use js: true, but not if I remove that (I use RSpec's config.treat_symbols_as_metadata_keys_with_true_values = true, fwiw.)

# encoding: UTF-8

require 'spec_helper'

feature "Create a shift", :js do
  scenario %q(
    In order to plan the workload
    As a coordinator
    I want to schedule shifts
    And I want to see when they're scheduled for
    ) do
      visit shifts_path
      click_link "new_shift_#{Date.current}"
      fill_in 'shift_note', with: 'Casper - luk'
      click_link_or_button 'submit'

      Shift.should have(1).record
      Shift.last.begins_at.should == Date.current

      page.should have_selector("ol[data-date=\"#{Date.current}\"] li#shift_#{Shift.last.id}")
    end
end

I can tell it's related to the DB not being cleaned, because it fails the first time (expected 1 record, got 0), passes the second time (because there's 1 record in the DB) and then fails again on any subsequent runs (expected 1 record, got 2 etc.)

I'm trying to avoid using a gem like DatabaseCleaner, to keep dependencies as few as possible, and to avoid a speed decrease in the test suite.

Any help/info/pointers are greatly appreciated!

Relevant info:

  • Rails 3.2.2
  • RSpec 2.9.0
  • Capybara 1.1.2
  • Capybara-webkit 0.11.0
  • FactoryGirl 2.6.4
  • Spork 0.9.0
  • Guard 1.0.1
  • Guard-spork 0.5.2

  • on a Macbook Air, OS X 10.7.3 (if that's relevant)

And my spec helper:

# encoding: UTF-8

require 'rubygems'
require 'spork'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'
  require 'capybara/rspec'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.mock_with :rspec
    config.use_transactional_fixtures = true
    config.treat_symbols_as_metadata_keys_with_true_values = true
    config.infer_base_class_for_anonymous_controllers = false

    config.include Factory::Syntax::Methods

    Capybara.javascript_driver = :webkit

    Rails.logger.level = 4 # speed - http://blog.plataformatec.com.br/tag/capybara/
  end
end

Spork.each_run do
  require 'factory_girl_rails'

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

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

  ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection
end
1
Anything relevant in spec/support? Can you show a spec that fails? Does it work without spork?cuvius
I've nothing in spec/support. The problem is the same when I run the specs without Spork - DB isn't cleaned. I should've mentioned that it is specific to specs using javascript - I'll update the question with a failing spec.cabgfx
Question updated with a failing spec. Thanks cuvius!cabgfx

1 Answers

1
votes

After much investigating, the problem seems to be with specs using JS in general, and not really the AR monkey patch.

I've re-phrased the problem in a new question here: RSpec+Capybara request specs w/ JS not working