Class: FactoryGirl::Factory

Inherits:
Object
  • Object
show all
Defined in:
lib/factory_girl/factory.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, options = {}) ⇒ Factory

:nodoc:



8
9
10
11
12
13
14
15
16
# File 'lib/factory_girl/factory.rb', line 8

def initialize(name, options = {}) #:nodoc:
  assert_valid_options(options)
  @name             = name.is_a?(Symbol) ? name : name.to_s.underscore.to_sym
  @parent           = options[:parent]
  @aliases          = options[:aliases] || []
  @class_name       = options[:class]
  @definition       = Definition.new(@name, options[:traits] || [])
  @compiled         = false
end

Instance Attribute Details

#definitionObject (readonly)

:nodoc:



6
7
8
# File 'lib/factory_girl/factory.rb', line 6

def definition
  @definition
end

#nameObject (readonly)

:nodoc:



6
7
8
# File 'lib/factory_girl/factory.rb', line 6

def name
  @name
end

Instance Method Details

#associationsObject



48
49
50
# File 'lib/factory_girl/factory.rb', line 48

def associations
  evaluator_class.attribute_list.associations
end

#build_classObject

:nodoc:



21
22
23
24
25
26
27
# File 'lib/factory_girl/factory.rb', line 21

def build_class #:nodoc:
  @build_class ||= if class_name.is_a? Class
    class_name
  else
    class_name.to_s.camelize.constantize
  end
end

#compileObject



81
82
83
84
85
86
87
88
# File 'lib/factory_girl/factory.rb', line 81

def compile
  unless @compiled
    parent.compile
    parent.defined_traits.each {|trait| define_trait(trait) }
    @definition.compile
    @compiled = true
  end
end

#human_namesObject



44
45
46
# File 'lib/factory_girl/factory.rb', line 44

def human_names
  names.map {|name| name.to_s.humanize.downcase }
end

#namesObject

Names for this factory, including aliases.

Example:

factory :user, aliases: [:author] do
  # ...
end

FactoryGirl.create(:author).class
# => User

Because an attribute defined without a value or block will build an association with the same name, this allows associations to be defined without factories, such as:

factory :user, aliases: [:author] do
  # ...
end

factory :post do
  author
end

FactoryGirl.create(:post).author.class
# => User


77
78
79
# File 'lib/factory_girl/factory.rb', line 77

def names
  [name] + @aliases
end

#run(strategy_class, overrides, &block) ⇒ Object

:nodoc:



29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/factory_girl/factory.rb', line 29

def run(strategy_class, overrides, &block) #:nodoc:
  block ||= ->(result) { result }
  compile

  strategy = strategy_class.new

  evaluator = evaluator_class.new(build_class, strategy, overrides.symbolize_keys)
  attribute_assigner = AttributeAssigner.new(evaluator, build_class, &instance_builder)

  evaluation = Evaluation.new(attribute_assigner, to_create)
  evaluation.add_observer(CallbacksObserver.new(callbacks, evaluator))

  strategy.result(evaluation).tap(&block)
end

#with_traits(traits) ⇒ Object



90
91
92
93
94
# File 'lib/factory_girl/factory.rb', line 90

def with_traits(traits)
  self.clone.tap do |factory_with_traits|
    factory_with_traits.inherit_traits traits
  end
end