Skip to content

Instantly share code, notes, and snippets.

@codenamev
Last active July 14, 2020 12:26
Show Gist options
  • Save codenamev/8aee0412b10f9e41da999edf21da62ce to your computer and use it in GitHub Desktop.
Save codenamev/8aee0412b10f9e41da999edf21da62ce to your computer and use it in GitHub Desktop.
Lightning fast Rails unit tests in RSpec
# 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
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
$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
@kleinjm
Copy link

kleinjm commented Apr 28, 2017

Looks like the article in active_record_spec_helper.rb no longer exists

@derencius
Copy link

maybe just use rails fixtures. fast per nature.

@coxandrew
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment