Class: FactoryGirl::DefinitionProxy
- Inherits:
-
Object
- Object
- FactoryGirl::DefinitionProxy
- Defined in:
- lib/factory_girl/definition_proxy.rb
Constant Summary
- UNPROXIED_METHODS =
%w(__send__ __id__ nil? send object_id extend instance_eval initialize block_given? raise caller)
Instance Attribute Summary (collapse)
-
- (Object) child_factories
readonly
Returns the value of attribute child_factories.
Instance Method Summary (collapse)
-
- (Object) add_attribute(name, value = nil, &block)
Adds an attribute that should be assigned on generated instances for this factory.
- - (Object) after(name, &block)
-
- (Object) association(name, options = {})
Adds an attribute that builds an association.
- - (Object) before(name, &block)
- - (Object) callback(name, &block)
- - (Object) factory(name, options = {}, &block)
- - (Object) ignore(&block)
-
- (DefinitionProxy) initialize(definition, ignore = false)
constructor
A new instance of DefinitionProxy.
- - (Object) initialize_with(&block)
-
- (Object) method_missing(name, *args, &block)
Calls add_attribute using the missing method name as the name of the attribute, so that:.
-
- (Object) sequence(name, *args, &block)
Adds an attribute that will have unique values generated by a sequence with a specified format.
- - (Object) skip_create
- - (Object) to_create(&block)
- - (Object) trait(name, &block)
Constructor Details
- (DefinitionProxy) initialize(definition, ignore = false)
A new instance of DefinitionProxy
11 12 13 14 15 |
# File 'lib/factory_girl/definition_proxy.rb', line 11 def initialize(definition, ignore = false) @definition = definition @ignore = ignore @child_factories = [] end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
- (Object) method_missing(name, *args, &block)
Calls add_attribute using the missing method name as the name of the attribute, so that:
factory :user do
name 'Billy Idol'
end
and:
factory :user do
add_attribute :name, 'Billy Idol'
end
are equivalent.
If no argument or block is given, factory_girl will look for a sequence or association with the same name. This means that:
factory :user do
email { create(:email) }
association :account
end
and:
factory :user do
email
account
end
are equivalent.
83 84 85 86 87 88 89 90 91 92 93 94 95 |
# File 'lib/factory_girl/definition_proxy.rb', line 83 def method_missing(name, *args, &block) if args.empty? && block.nil? @definition.declare_attribute(Declaration::Implicit.new(name, @definition, @ignore)) elsif args.first.respond_to?(:has_key?) && args.first.has_key?(:factory) association(name, *args) elsif FactoryGirl.callback_names.include?(name) callback_when, callback_name = name.to_s.split('_', 2) ActiveSupport::Deprecation.warn "Calling #{name} is deprecated; use the syntax #{callback_when}(:#{callback_name}) {}", caller @definition.add_callback(Callback.new(name, block)) else add_attribute(name, *args, &block) end end |
Instance Attribute Details
- (Object) child_factories (readonly)
Returns the value of attribute child_factories
9 10 11 |
# File 'lib/factory_girl/definition_proxy.rb', line 9 def child_factories @child_factories end |
Instance Method Details
- (Object) add_attribute(name, value = nil, &block)
Adds an attribute that should be assigned on generated instances for this factory.
This method should be called with either a value or block, but not both. If called with a block, the attribute will be generated "lazily," whenever an instance is generated. Lazy attribute blocks will not be called if that attribute is overridden for a specific instance.
When defining lazy attributes, an instance of FactoryGirl::Strategy will be yielded, allowing associations to be built using the correct build strategy.
Arguments:
-
name: Symbol or String The name of this attribute. This will be assigned using "name=" for generated instances.
-
value: Object If no block is given, this value will be used for this attribute.
35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/factory_girl/definition_proxy.rb', line 35 def add_attribute(name, value = nil, &block) raise AttributeDefinitionError, 'Both value and block given' if value && block_given? declaration = if block_given? Declaration::Dynamic.new(name, @ignore, block) else Declaration::Static.new(name, value, @ignore) end @definition.declare_attribute(declaration) end |
- (Object) after(name, &block)
169 170 171 |
# File 'lib/factory_girl/definition_proxy.rb', line 169 def after(name, &block) callback("after_#{name}", &block) end |
- (Object) association(name, options = {})
Adds an attribute that builds an association. The associated instance will be built using the same build strategy as the parent instance.
Example:
factory :user do
name 'Joey'
end
factory :post do
association :author, factory: :user
end
Arguments:
-
name: Symbol The name of this attribute.
-
options: Hash
Options:
-
factory: Symbol or String
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.
141 142 143 |
# File 'lib/factory_girl/definition_proxy.rb', line 141 def association(name, = {}) @definition.declare_attribute(Declaration::Association.new(name, )) end |
- (Object) before(name, &block)
165 166 167 |
# File 'lib/factory_girl/definition_proxy.rb', line 165 def before(name, &block) callback("before_#{name}", &block) end |
- (Object) callback(name, &block)
173 174 175 176 |
# File 'lib/factory_girl/definition_proxy.rb', line 173 def callback(name, &block) FactoryGirl.register_callback(name) @definition.add_callback(Callback.new(name, block)) end |
- (Object) factory(name, options = {}, &block)
153 154 155 |
# File 'lib/factory_girl/definition_proxy.rb', line 153 def factory(name, = {}, &block) @child_factories << [name, , block] end |
- (Object) ignore(&block)
47 48 49 50 |
# File 'lib/factory_girl/definition_proxy.rb', line 47 def ignore(&block) proxy = DefinitionProxy.new(@definition, true) proxy.instance_eval(&block) end |
- (Object) initialize_with(&block)
161 162 163 |
# File 'lib/factory_girl/definition_proxy.rb', line 161 def initialize_with(&block) @definition.define_constructor(&block) end |
- (Object) sequence(name, *args, &block)
Adds an attribute that will have unique values generated by a sequence with a specified format.
The result of:
factory :user do
sequence(:email) { |n| "person#{n}@example.com" }
end
Is equal to:
sequence(:email) { |n| "person#{n}@example.com" }
factory :user do
email { FactoryGirl.create(:email) }
end
Except that no globally available sequence will be defined.
113 114 115 116 |
# File 'lib/factory_girl/definition_proxy.rb', line 113 def sequence(name, *args, &block) sequence = Sequence.new(name, *args, &block) add_attribute(name) { sequence.next } end |
- (Object) skip_create
149 150 151 |
# File 'lib/factory_girl/definition_proxy.rb', line 149 def skip_create @definition.skip_create end |
- (Object) to_create(&block)
145 146 147 |
# File 'lib/factory_girl/definition_proxy.rb', line 145 def to_create(&block) @definition.to_create(&block) end |
- (Object) trait(name, &block)
157 158 159 |
# File 'lib/factory_girl/definition_proxy.rb', line 157 def trait(name, &block) @definition.define_trait(Trait.new(name, &block)) end |