codenamev
2/17/2017 - 7:03 PM

Lightning fast Rails unit tests in RSpec

Lightning fast Rails unit tests in RSpec

$loaded_factories_for_active_record = []

def require_factory_and_model_for(factory_name, model_name: nil)
  require "factory_girl" unless defined? FactoryGirl

  model_name ||= factory_name
  require "models/#{model_name}"

  require_factory_for(factory_name)
end

def require_factory_for(factory_name)
  return if $loaded_factories_for_active_record.include?(factory_name)

  begin
    require_relative "factories/#{factory_name}"
  rescue LoadError
    require 'active_support/inflector/inflections'
    require_relative "factories/#{factory_name.to_s.pluralize}"
  end

 # Now require any nested associations required by the factory
 FactoryGirl.factory_by_name(factory_name).associations.each do |association|
   model_name = nil
   begin
     model_name = FactoryGirl.factory_by_name(association.name).send(:class_name).to_s.underscore
     require_factory_and_model_for(association.factory, model_name: model_name)
   rescue ArgumentError => e
     if e.message.include?("not registered") && !defined?(FactoryGirl.factory_by_name(association.name).send(:class_name).classify)
     require_factory_and_model_for(association.factory, model_name: model_name)
     end
   end
 end

  $loaded_factories_for_active_record << factory_name
end
require 'active_record_spec_helper'

require_factory_and_model_for(:user)

describe User do
  describe ".active" do
    it "returns active users" do
      active_user = FactoryGirl.create(:user, active: true)
      inactive_user = FactoryGirl.create(:user, active: false)
      
      active_users = User.active
      expect(active_users).to include active_user
      expect(active_users).to_not include inactive_user
    end
  end
end
# based on: http://articles.coreyhaines.com/posts/active-record-spec-helper/

require 'active_record'
require 'models/application_record'
require 'yaml'

# Setup factory girl helpers to keep requires to a minimum
require 'factory_girl_require_helper'

connection_info = YAML.load_file("config/database.yml")["test"]
ActiveRecord::Base.establish_connection(connection_info)

RSpec.configure do |config|
  config.around do |example|
    ActiveRecord::Base.transaction do
      example.run
      raise ActiveRecord::Rollback
    end
  end
end