1
0
Fork 0
mirror of https://github.com/thoughtbot/factory_bot.git synced 2022-11-09 11:43:51 -05:00

#11 - added syntactic sugar for associations

This commit is contained in:
Joe Ferris 2008-07-29 15:53:47 -04:00
parent ab0b57a93d
commit b4a5ab0eb8
3 changed files with 70 additions and 1 deletions

View file

@ -123,6 +123,35 @@ class Factory
add_attribute(name, *args, &block) add_attribute(name, *args, &block)
end end
# Adds an attribute that builds an association. The associated instance will
# be built using the same build strategy as the parent instance.
#
# Example:
# Factory.define :user do |f|
# f.name 'Joey'
# end
#
# Factory.define :post do |f|
# f.association :author, :factory => :user
# end
#
# Arguments:
# name: (Symbol)
# The name of this attribute.
# options: (Hash)
# factory: (Symbol)
# The name of the factory to use when building the associated instance.
# If no name is given, the name of the attribute is assumed to be the
# name of the factory. For example, a "user" association will by
# default use the "user" factory.
def association (name, options = {})
name = name.to_sym
options = options.symbolize_keys
association_factory = options[:factory] || name
add_attribute(name) {|a| a.association(association_factory) }
end
def attributes_for (attrs = {}) #:nodoc: def attributes_for (attrs = {}) #:nodoc:
build_attributes_hash(attrs, :attributes_for) build_attributes_hash(attrs, :attributes_for)
end end

View file

@ -168,6 +168,46 @@ class FactoryTest < Test::Unit::TestCase
end end
context "when adding an association without a factory name" do
setup do
@factory = Factory.new(:post)
@name = :user
@factory.association(@name)
Post.any_instance.stubs(:user=)
end
should "add an attribute with the name of the association" do
assert @factory.attributes_for.key?(@name)
end
should "create a block that builds the association" do
Factory.expects(:build).with(@name, {})
@factory.build
end
end
context "when adding an association with a factory name" do
setup do
@factory = Factory.new(:post)
@name = :author
@factory_name = :user
@factory.association(@name, :factory => @factory_name)
end
should "add an attribute with the name of the association" do
assert @factory.attributes_for.key?(@name)
end
should "create a block that builds the association" do
Factory.expects(:build).with(@factory_name, {})
@factory.build
end
end
should "add an attribute using the method name when passed an undefined method" do should "add an attribute using the method name when passed an undefined method" do
@attr = :first_name @attr = :first_name
@value = 'Sugar' @value = 'Sugar'

View file

@ -12,7 +12,7 @@ class IntegrationTest < Test::Unit::TestCase
Factory.define 'post' do |f| Factory.define 'post' do |f|
f.name 'Test Post' f.name 'Test Post'
f.author {|a| a.association(:user) } f.association :author, :factory => :user
end end
Factory.define :admin, :class => User do |f| Factory.define :admin, :class => User do |f|