Skip to content

Instantly share code, notes, and snippets.

@palkan
Created March 28, 2017 13:18
Show Gist options
  • Save palkan/e0315dee43d3240f5011aeddd51910c8 to your computer and use it in GitHub Desktop.
Save palkan/e0315dee43d3240f5011aeddd51910c8 to your computer and use it in GitHub Desktop.
FactoryDefault: re-use associated objects in factories
module FactoryDefault
module CreateDefaultMethod
def create_default(name, *args, &block)
res = create(name, *args, &block)
FactoryDefault.register(name, res)
res
end
end
module RunnerExt
refine FactoryGirl::FactoryRunner do
def name
@name
end
end
end
using RunnerExt
module StrategyExt
def association(runner)
return super unless FactoryDefault.exists?(runner.name)
FactoryDefault.get(runner.name)
end
end
class << self
def init
FactoryGirl::Syntax::Methods.include CreateDefaultMethod
FactoryGirl::Strategy::Create.prepend StrategyExt
FactoryGirl::Strategy::Build.prepend StrategyExt
FactoryGirl::Strategy::Stub.prepend StrategyExt
end
def register(name, obj)
store[name] = obj
end
def get(name)
store[name]
end
def exists?(name)
store.key?(name)
end
def remove(name)
store.delete(name)
end
def reset
@store = nil
end
private
def store
@store ||= {}
end
end
end
if ENV['FD']
FactoryDefault.init
RSpec.configure do |config|
config.after(:each) { FactoryDefault.reset }
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment