Last active
July 14, 2020 12:26
-
-
Save codenamev/8aee0412b10f9e41da999edf21da62ce to your computer and use it in GitHub Desktop.
Lightning fast Rails unit tests in RSpec
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-I app |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# 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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$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 |
maybe just use rails fixtures. fast per nature.
@kleinjm You just need to remove the trailing slash: http://articles.coreyhaines.com/posts/active-record-spec-helper
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Looks like the article in
active_record_spec_helper.rb
no longer exists