factory_girl 2.0.3 → 2.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/GETTING_STARTED.md +72 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +1 -0
- data/README.md +1 -1
- data/features/support/test.db +0 -0
- data/lib/factory_girl.rb +15 -0
- data/lib/factory_girl/attribute.rb +4 -0
- data/lib/factory_girl/attribute/implicit.rb +5 -2
- data/lib/factory_girl/attribute/trait.rb +22 -0
- data/lib/factory_girl/attribute_list.rb +59 -0
- data/lib/factory_girl/definition_proxy.rb +5 -1
- data/lib/factory_girl/factory.rb +47 -31
- data/lib/factory_girl/syntax/default.rb +9 -0
- data/lib/factory_girl/trait.rb +29 -0
- data/lib/factory_girl/version.rb +1 -1
- data/spec/acceptance/attributes_ordered_spec.rb +33 -0
- data/spec/acceptance/overrides_spec.rb +65 -0
- data/spec/acceptance/parent_spec.rb +10 -6
- data/spec/acceptance/traits_spec.rb +171 -0
- data/spec/factory_girl/attribute_list_spec.rb +111 -0
- data/spec/factory_girl/definition_proxy_spec.rb +1 -1
- data/spec/factory_girl/factory_spec.rb +0 -18
- data/spec/spec_helper.rb +1 -0
- metadata +29 -18
data/GETTING_STARTED.md
CHANGED
@@ -259,6 +259,78 @@ Without a block, the value will increment itself, starting at its initial value:
|
|
259
259
|
sequence(:position)
|
260
260
|
end
|
261
261
|
|
262
|
+
Traits
|
263
|
+
------
|
264
|
+
|
265
|
+
Traits allow you to group attributes together and then apply them
|
266
|
+
to any factory.
|
267
|
+
|
268
|
+
factory :user, :aliases => [:author]
|
269
|
+
|
270
|
+
factory :story do
|
271
|
+
title "My awesome story"
|
272
|
+
author
|
273
|
+
|
274
|
+
trait :published do
|
275
|
+
published true
|
276
|
+
end
|
277
|
+
|
278
|
+
trait :unpublished do
|
279
|
+
published false
|
280
|
+
end
|
281
|
+
|
282
|
+
trait :week_long_publishing do
|
283
|
+
start_at { 1.week.ago }
|
284
|
+
end_at { Time.now }
|
285
|
+
end
|
286
|
+
|
287
|
+
trait :month_long_publishing do
|
288
|
+
start_at { 1.month.ago }
|
289
|
+
end_at { Time.now }
|
290
|
+
end
|
291
|
+
|
292
|
+
factory :week_long_published_story, :traits => [:published, :week_long_publishing]
|
293
|
+
factory :month_long_published_story, :traits => [:published, :month_long_publishing]
|
294
|
+
factory :week_long_unpublished_story, :traits => [:unpublished, :week_long_publishing]
|
295
|
+
factory :month_long_unpublished_story, :traits => [:unpublished, :month_long_publishing]
|
296
|
+
end
|
297
|
+
|
298
|
+
Traits can be used as attributes:
|
299
|
+
|
300
|
+
factory :week_long_published_story_with_title, :parent => :story do
|
301
|
+
published
|
302
|
+
week_long_publishing
|
303
|
+
title { "Publishing that was started at {start_at}" }
|
304
|
+
end
|
305
|
+
|
306
|
+
Traits that define the same attributes won't raise AttributeDefinitionErrors;
|
307
|
+
the trait that defines the attribute latest gets precedence.
|
308
|
+
|
309
|
+
factory :user do
|
310
|
+
name "Friendly User"
|
311
|
+
login { name }
|
312
|
+
|
313
|
+
trait :male do
|
314
|
+
name "John Doe"
|
315
|
+
gender "Male"
|
316
|
+
login { "#{name} (M)" }
|
317
|
+
end
|
318
|
+
|
319
|
+
trait :female do
|
320
|
+
name "Jane Doe"
|
321
|
+
gender "Female"
|
322
|
+
login { "#{name} (F)" }
|
323
|
+
end
|
324
|
+
|
325
|
+
trait :admin do
|
326
|
+
admin true
|
327
|
+
login { "admin-#{name}" }
|
328
|
+
end
|
329
|
+
|
330
|
+
factory :male_admin, :traits => [:male, :admin] # login will be "admin-John Doe"
|
331
|
+
factory :female_admin, :traits => [:admin, :female] # login will be "Jane Doe (F)"
|
332
|
+
end
|
333
|
+
|
262
334
|
Callbacks
|
263
335
|
---------
|
264
336
|
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# factory_girl [](http://travis-ci.org/thoughtbot/factory_girl)
|
2
2
|
|
3
3
|
factory_girl is a fixtures replacement with a straightforward definition syntax, support for multiple build strategies (saved instances, unsaved instances, attribute hashes, and stubbed objects), and support for multiple factories for the same class (user, admin_user, and so on), including factory inheritance.
|
4
4
|
|
data/features/support/test.db
CHANGED
Binary file
|
data/lib/factory_girl.rb
CHANGED
@@ -12,7 +12,10 @@ require 'factory_girl/attribute/association'
|
|
12
12
|
require 'factory_girl/attribute/callback'
|
13
13
|
require 'factory_girl/attribute/sequence'
|
14
14
|
require 'factory_girl/attribute/implicit'
|
15
|
+
require 'factory_girl/attribute/trait'
|
15
16
|
require 'factory_girl/sequence'
|
17
|
+
require 'factory_girl/attribute_list'
|
18
|
+
require 'factory_girl/trait'
|
16
19
|
require 'factory_girl/aliases'
|
17
20
|
require 'factory_girl/definition_proxy'
|
18
21
|
require 'factory_girl/syntax/methods'
|
@@ -50,4 +53,16 @@ module FactoryGirl
|
|
50
53
|
def self.sequence_by_name(name)
|
51
54
|
sequences.find(name)
|
52
55
|
end
|
56
|
+
|
57
|
+
def self.traits
|
58
|
+
@traits ||= Registry.new
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.register_trait(trait)
|
62
|
+
traits.add(trait)
|
63
|
+
end
|
64
|
+
|
65
|
+
def self.trait_by_name(name)
|
66
|
+
traits.find(name)
|
67
|
+
end
|
53
68
|
end
|
@@ -2,8 +2,9 @@ module FactoryGirl
|
|
2
2
|
class Attribute
|
3
3
|
|
4
4
|
class Implicit < Attribute
|
5
|
-
def initialize(name)
|
5
|
+
def initialize(name, factory = nil)
|
6
6
|
super(name)
|
7
|
+
@factory = factory
|
7
8
|
end
|
8
9
|
|
9
10
|
def add_to(proxy)
|
@@ -27,8 +28,10 @@ module FactoryGirl
|
|
27
28
|
def resolve_name
|
28
29
|
if FactoryGirl.factories.registered?(name)
|
29
30
|
Attribute::Association.new(name, name, {})
|
30
|
-
|
31
|
+
elsif FactoryGirl.sequences.registered?(name)
|
31
32
|
Attribute::Sequence.new(name, name)
|
33
|
+
else
|
34
|
+
Attribute::Trait.new(name, @factory)
|
32
35
|
end
|
33
36
|
end
|
34
37
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module FactoryGirl
|
2
|
+
class Attribute #:nodoc:
|
3
|
+
|
4
|
+
class Trait < Attribute #:nodoc:
|
5
|
+
def initialize(name, factory)
|
6
|
+
super(name)
|
7
|
+
@factory = factory
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_to(proxy)
|
11
|
+
trait.attributes.each { |attr| attr.add_to(proxy) }
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def trait
|
17
|
+
(@factory || FactoryGirl).trait_by_name(name)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
module FactoryGirl
|
2
|
+
class AttributeList
|
3
|
+
include Enumerable
|
4
|
+
|
5
|
+
def initialize
|
6
|
+
@attributes = []
|
7
|
+
end
|
8
|
+
|
9
|
+
def define_attribute(attribute)
|
10
|
+
if attribute_defined?(attribute.name)
|
11
|
+
raise AttributeDefinitionError, "Attribute already defined: #{attribute.name}"
|
12
|
+
end
|
13
|
+
|
14
|
+
@attributes << attribute
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_callback(name, &block)
|
18
|
+
unless valid_callback_names.include?(name.to_sym)
|
19
|
+
raise InvalidCallbackNameError, "#{name} is not a valid callback name. Valid callback names are #{valid_callback_names.inspect}"
|
20
|
+
end
|
21
|
+
|
22
|
+
@attributes << Attribute::Callback.new(name.to_sym, block)
|
23
|
+
end
|
24
|
+
|
25
|
+
def each(&block)
|
26
|
+
@attributes.each(&block)
|
27
|
+
end
|
28
|
+
|
29
|
+
def attribute_defined?(attribute_name)
|
30
|
+
!@attributes.detect do |attribute|
|
31
|
+
attribute.name == attribute_name &&
|
32
|
+
!attribute.is_a?(FactoryGirl::Attribute::Callback)
|
33
|
+
end.nil?
|
34
|
+
end
|
35
|
+
|
36
|
+
def apply_attributes(attributes_to_apply)
|
37
|
+
new_attributes = []
|
38
|
+
|
39
|
+
attributes_to_apply.each do |attribute|
|
40
|
+
if attribute_defined?(attribute.name)
|
41
|
+
@attributes.delete_if do |attrib|
|
42
|
+
new_attributes << attrib.clone if attrib.name == attribute.name
|
43
|
+
end
|
44
|
+
else
|
45
|
+
new_attributes << attribute.clone
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
@attributes.unshift *new_attributes
|
50
|
+
@attributes = @attributes.partition {|attr| attr.priority.zero? }.flatten
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def valid_callback_names
|
56
|
+
[:after_build, :after_create, :after_stub]
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -78,7 +78,7 @@ module FactoryGirl
|
|
78
78
|
# are equivalent.
|
79
79
|
def method_missing(name, *args, &block)
|
80
80
|
if args.empty? && block.nil?
|
81
|
-
@factory.define_attribute(Attribute::Implicit.new(name))
|
81
|
+
@factory.define_attribute(Attribute::Implicit.new(name, @factory))
|
82
82
|
elsif args.first.is_a?(Hash) && args.first.has_key?(:factory)
|
83
83
|
association(name, *args)
|
84
84
|
else
|
@@ -154,5 +154,9 @@ module FactoryGirl
|
|
154
154
|
def factory(name, options = {}, &block)
|
155
155
|
@child_factories << [name, options, block]
|
156
156
|
end
|
157
|
+
|
158
|
+
def trait(name, &block)
|
159
|
+
@factory.define_trait(Trait.new(name, &block))
|
160
|
+
end
|
157
161
|
end
|
158
162
|
end
|
data/lib/factory_girl/factory.rb
CHANGED
@@ -13,7 +13,7 @@ module FactoryGirl
|
|
13
13
|
|
14
14
|
class Factory
|
15
15
|
attr_reader :name #:nodoc:
|
16
|
-
attr_reader :
|
16
|
+
attr_reader :traits #:nodoc:
|
17
17
|
|
18
18
|
def factory_name
|
19
19
|
puts "WARNING: factory.factory_name is deprecated. Use factory.name instead."
|
@@ -34,55 +34,62 @@ module FactoryGirl
|
|
34
34
|
|
35
35
|
def initialize(name, options = {}) #:nodoc:
|
36
36
|
assert_valid_options(options)
|
37
|
-
@name
|
38
|
-
@
|
39
|
-
@
|
37
|
+
@name = factory_name_for(name)
|
38
|
+
@parent = options[:parent]
|
39
|
+
@options = options
|
40
|
+
@attribute_list = AttributeList.new
|
41
|
+
@traits = []
|
40
42
|
end
|
41
43
|
|
42
44
|
def inherit_from(parent) #:nodoc:
|
43
45
|
@options[:class] ||= parent.class_name
|
44
46
|
@options[:default_strategy] ||= parent.default_strategy
|
45
47
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
48
|
+
apply_attributes(parent.attributes)
|
49
|
+
end
|
50
|
+
|
51
|
+
def apply_traits(traits) #:nodoc:
|
52
|
+
traits.reverse.map { |name| trait_by_name(name) }.each do |trait|
|
53
|
+
apply_attributes(trait.attributes)
|
51
54
|
end
|
55
|
+
end
|
52
56
|
|
53
|
-
|
54
|
-
@
|
57
|
+
def apply_attributes(attributes_to_apply)
|
58
|
+
@attribute_list.apply_attributes(attributes_to_apply)
|
55
59
|
end
|
56
60
|
|
57
61
|
def define_attribute(attribute)
|
58
|
-
name = attribute.name
|
59
|
-
# TODO: move these checks into Attribute
|
60
|
-
if attribute_defined?(name)
|
61
|
-
raise AttributeDefinitionError, "Attribute already defined: #{name}"
|
62
|
-
end
|
63
62
|
if attribute.respond_to?(:factory) && attribute.factory == self.name
|
64
|
-
raise AssociationDefinitionError, "Self-referencing association '#{name}' in factory '#{self.name}'"
|
63
|
+
raise AssociationDefinitionError, "Self-referencing association '#{attribute.name}' in factory '#{self.name}'"
|
65
64
|
end
|
66
|
-
|
65
|
+
|
66
|
+
@attribute_list.define_attribute(attribute)
|
67
|
+
end
|
68
|
+
|
69
|
+
def define_trait(trait)
|
70
|
+
@traits << trait
|
67
71
|
end
|
68
72
|
|
69
73
|
def add_callback(name, &block)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
+
@attribute_list.add_callback(name, &block)
|
75
|
+
end
|
76
|
+
|
77
|
+
def attributes
|
78
|
+
@attribute_list.to_a
|
74
79
|
end
|
75
80
|
|
76
81
|
def run(proxy_class, overrides) #:nodoc:
|
77
82
|
proxy = proxy_class.new(build_class)
|
78
83
|
overrides = symbolize_keys(overrides)
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
unless passed_keys.include?(attribute.name)
|
84
|
+
@attribute_list.each do |attribute|
|
85
|
+
factory_overrides = overrides.select { |attr, val| attribute.aliases_for?(attr) }
|
86
|
+
if factory_overrides.empty?
|
83
87
|
attribute.add_to(proxy)
|
88
|
+
else
|
89
|
+
factory_overrides.each { |attr, val| proxy.set(attr, val) }
|
84
90
|
end
|
85
91
|
end
|
92
|
+
overrides.each { |attr, val| proxy.set(attr, val) }
|
86
93
|
proxy.result(@to_create_block)
|
87
94
|
end
|
88
95
|
|
@@ -94,6 +101,16 @@ module FactoryGirl
|
|
94
101
|
attributes.select {|attribute| attribute.association? }
|
95
102
|
end
|
96
103
|
|
104
|
+
def trait_by_name(name)
|
105
|
+
if existing_attribute = trait_for(name)
|
106
|
+
existing_attribute
|
107
|
+
elsif @parent
|
108
|
+
FactoryGirl.factory_by_name(@parent).trait_by_name(name)
|
109
|
+
else
|
110
|
+
FactoryGirl.trait_by_name(name)
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
97
114
|
# Names for this factory, including aliases.
|
98
115
|
#
|
99
116
|
# Example:
|
@@ -148,12 +165,8 @@ module FactoryGirl
|
|
148
165
|
end
|
149
166
|
end
|
150
167
|
|
151
|
-
def attribute_defined? (name)
|
152
|
-
!@attributes.detect {|attr| attr.name == name && !attr.is_a?(Attribute::Callback) }.nil?
|
153
|
-
end
|
154
|
-
|
155
168
|
def assert_valid_options(options)
|
156
|
-
invalid_keys = options.keys - [:class, :parent, :default_strategy, :aliases]
|
169
|
+
invalid_keys = options.keys - [:class, :parent, :default_strategy, :aliases, :traits]
|
157
170
|
unless invalid_keys == []
|
158
171
|
raise ArgumentError, "Unknown arguments: #{invalid_keys.inspect}"
|
159
172
|
end
|
@@ -194,5 +207,8 @@ module FactoryGirl
|
|
194
207
|
end
|
195
208
|
end
|
196
209
|
|
210
|
+
def trait_for(name)
|
211
|
+
traits.detect {|trait| trait.name == name }
|
212
|
+
end
|
197
213
|
end
|
198
214
|
end
|
@@ -16,6 +16,11 @@ module FactoryGirl
|
|
16
16
|
factory = Factory.new(name, options)
|
17
17
|
proxy = FactoryGirl::DefinitionProxy.new(factory)
|
18
18
|
proxy.instance_eval(&block) if block_given?
|
19
|
+
|
20
|
+
if traits = options.delete(:traits)
|
21
|
+
factory.apply_traits(traits)
|
22
|
+
end
|
23
|
+
|
19
24
|
if parent = options.delete(:parent)
|
20
25
|
factory.inherit_from(FactoryGirl.factory_by_name(parent))
|
21
26
|
end
|
@@ -29,6 +34,10 @@ module FactoryGirl
|
|
29
34
|
def sequence(name, start_value = 1, &block)
|
30
35
|
FactoryGirl.register_sequence(Sequence.new(name, start_value, &block))
|
31
36
|
end
|
37
|
+
|
38
|
+
def trait(name, &block)
|
39
|
+
FactoryGirl.register_trait(Trait.new(name, &block))
|
40
|
+
end
|
32
41
|
end
|
33
42
|
end
|
34
43
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module FactoryGirl
|
2
|
+
class Trait
|
3
|
+
attr_reader :name
|
4
|
+
|
5
|
+
def initialize(name, &block) #:nodoc:
|
6
|
+
@name = name
|
7
|
+
@attribute_list = AttributeList.new
|
8
|
+
|
9
|
+
proxy = FactoryGirl::DefinitionProxy.new(self)
|
10
|
+
proxy.instance_eval(&block) if block_given?
|
11
|
+
end
|
12
|
+
|
13
|
+
def define_attribute(attribute)
|
14
|
+
@attribute_list.define_attribute(attribute)
|
15
|
+
end
|
16
|
+
|
17
|
+
def add_callback(name, &block)
|
18
|
+
@attribute_list.add_callback(name, &block)
|
19
|
+
end
|
20
|
+
|
21
|
+
def attributes
|
22
|
+
@attribute_list.to_a
|
23
|
+
end
|
24
|
+
|
25
|
+
def names
|
26
|
+
[@name]
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
data/lib/factory_girl/version.rb
CHANGED
@@ -0,0 +1,33 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'acceptance/acceptance_helper'
|
3
|
+
|
4
|
+
describe "a generated attributes hash where order matters" do
|
5
|
+
include FactoryGirl::Syntax::Methods
|
6
|
+
|
7
|
+
before do
|
8
|
+
define_model('ParentModel', :static => :integer,
|
9
|
+
:evaluates_first => :integer,
|
10
|
+
:evaluates_second => :integer,
|
11
|
+
:evaluates_third => :integer)
|
12
|
+
|
13
|
+
FactoryGirl.define do
|
14
|
+
factory :parent_model do
|
15
|
+
evaluates_first { static }
|
16
|
+
evaluates_second { evaluates_first }
|
17
|
+
evaluates_third { evaluates_second }
|
18
|
+
|
19
|
+
factory :child_model do
|
20
|
+
static 1
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
subject { FactoryGirl.build(:child_model) }
|
27
|
+
|
28
|
+
it "assigns attributes in the order they're defined with preference to static attributes" do
|
29
|
+
subject[:evaluates_first].should == 1
|
30
|
+
subject[:evaluates_second].should == 1
|
31
|
+
subject[:evaluates_third].should == 1
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'acceptance/acceptance_helper'
|
3
|
+
require 'active_support/ordered_hash'
|
4
|
+
|
5
|
+
describe "attribute overrides" do
|
6
|
+
before do
|
7
|
+
define_model('User', :admin => :boolean)
|
8
|
+
define_model('Post', :title => :string,
|
9
|
+
:secure => :boolean,
|
10
|
+
:user_id => :integer) do
|
11
|
+
belongs_to :user
|
12
|
+
|
13
|
+
def secure=(value)
|
14
|
+
return unless user && user.admin?
|
15
|
+
write_attribute(:secure, value)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
FactoryGirl.define do
|
20
|
+
factory :user do
|
21
|
+
factory :admin do
|
22
|
+
admin true
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
factory :post do
|
27
|
+
user
|
28
|
+
title "default title"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
let(:admin) { FactoryGirl.create(:admin) }
|
34
|
+
|
35
|
+
let(:post_attributes) do
|
36
|
+
attributes = ActiveSupport::OrderedHash.new
|
37
|
+
attributes[:secure] = false
|
38
|
+
attributes
|
39
|
+
end
|
40
|
+
|
41
|
+
let(:non_admin_post_attributes) do
|
42
|
+
post_attributes[:user] = FactoryGirl.create(:user)
|
43
|
+
post_attributes
|
44
|
+
end
|
45
|
+
|
46
|
+
let(:admin_post_attributes) do
|
47
|
+
post_attributes[:user] = admin
|
48
|
+
post_attributes
|
49
|
+
end
|
50
|
+
|
51
|
+
context "with an admin posting" do
|
52
|
+
subject { FactoryGirl.create(:post, admin_post_attributes) }
|
53
|
+
its(:secure) { should == false }
|
54
|
+
end
|
55
|
+
|
56
|
+
context "with a non-admin posting" do
|
57
|
+
subject { FactoryGirl.create(:post, non_admin_post_attributes) }
|
58
|
+
its(:secure) { should be_nil }
|
59
|
+
end
|
60
|
+
|
61
|
+
context "with no user posting" do
|
62
|
+
subject { FactoryGirl.create(:post, post_attributes) }
|
63
|
+
its(:secure) { should be_nil }
|
64
|
+
end
|
65
|
+
end
|
@@ -3,16 +3,18 @@ require 'acceptance/acceptance_helper'
|
|
3
3
|
|
4
4
|
describe "an instance generated by a factory that inherits from another factory" do
|
5
5
|
before do
|
6
|
-
define_model("User", :name => :string, :admin => :boolean, :email => :string)
|
6
|
+
define_model("User", :name => :string, :admin => :boolean, :email => :string, :upper_email => :string, :login => :string)
|
7
7
|
|
8
8
|
FactoryGirl.define do
|
9
9
|
factory :user do
|
10
10
|
name "John"
|
11
11
|
email { "#{name.downcase}@example.com" }
|
12
|
+
login { email }
|
12
13
|
|
13
14
|
factory :admin do
|
14
15
|
name "admin"
|
15
16
|
admin true
|
17
|
+
upper_email { email.upcase }
|
16
18
|
end
|
17
19
|
|
18
20
|
factory :guest do
|
@@ -29,11 +31,12 @@ describe "an instance generated by a factory that inherits from another factory"
|
|
29
31
|
end
|
30
32
|
|
31
33
|
describe "the child class redefining parent's static method used by a dynamic method" do
|
32
|
-
subject
|
33
|
-
it
|
34
|
-
it
|
35
|
-
its(:name)
|
36
|
-
its(:email)
|
34
|
+
subject { FactoryGirl.create(:admin) }
|
35
|
+
it { should be_kind_of(User) }
|
36
|
+
it { should be_admin }
|
37
|
+
its(:name) { should == "admin" }
|
38
|
+
its(:email) { should == "admin@example.com" }
|
39
|
+
its(:upper_email) { should == "ADMIN@EXAMPLE.COM"}
|
37
40
|
end
|
38
41
|
|
39
42
|
describe "the child class redefining parent's dynamic method" do
|
@@ -41,6 +44,7 @@ describe "an instance generated by a factory that inherits from another factory"
|
|
41
44
|
it { should_not be_admin }
|
42
45
|
its(:name) { should == "John" }
|
43
46
|
its(:email) { should eql "John-guest@example.com" }
|
47
|
+
its(:login) { should == "John-guest@example.com" }
|
44
48
|
end
|
45
49
|
end
|
46
50
|
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
require "acceptance/acceptance_helper"
|
3
|
+
|
4
|
+
describe "an instance generated by a factory with multiple traits" do
|
5
|
+
before do
|
6
|
+
define_model("User",
|
7
|
+
:name => :string,
|
8
|
+
:admin => :boolean,
|
9
|
+
:gender => :string,
|
10
|
+
:email => :string,
|
11
|
+
:date_of_birth => :date,
|
12
|
+
:great => :string)
|
13
|
+
|
14
|
+
FactoryGirl.define do
|
15
|
+
factory :user_without_admin_scoping, :class => User do
|
16
|
+
admin_trait
|
17
|
+
end
|
18
|
+
|
19
|
+
factory :user do
|
20
|
+
name "John"
|
21
|
+
|
22
|
+
trait :great do
|
23
|
+
great "GREAT!!!"
|
24
|
+
end
|
25
|
+
|
26
|
+
trait :admin do
|
27
|
+
admin true
|
28
|
+
end
|
29
|
+
|
30
|
+
trait :admin_trait do
|
31
|
+
admin true
|
32
|
+
end
|
33
|
+
|
34
|
+
trait :male do
|
35
|
+
name "Joe"
|
36
|
+
gender "Male"
|
37
|
+
end
|
38
|
+
|
39
|
+
trait :female do
|
40
|
+
name "Jane"
|
41
|
+
gender "Female"
|
42
|
+
end
|
43
|
+
|
44
|
+
factory :great_user do
|
45
|
+
great
|
46
|
+
end
|
47
|
+
|
48
|
+
factory :admin, :traits => [:admin]
|
49
|
+
|
50
|
+
factory :male_user do
|
51
|
+
male
|
52
|
+
|
53
|
+
factory :child_male_user do
|
54
|
+
date_of_birth { Date.parse("1/1/2000") }
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
factory :female, :traits => [:female] do
|
59
|
+
trait :admin do
|
60
|
+
admin true
|
61
|
+
name "Judy"
|
62
|
+
end
|
63
|
+
|
64
|
+
factory :female_admin_judy, :traits => [:admin]
|
65
|
+
end
|
66
|
+
|
67
|
+
factory :female_admin, :traits => [:female, :admin]
|
68
|
+
factory :female_after_male_admin, :traits => [:male, :female, :admin]
|
69
|
+
factory :male_after_female_admin, :traits => [:female, :male, :admin]
|
70
|
+
end
|
71
|
+
|
72
|
+
trait :email do
|
73
|
+
email { "#{name}@example.com" }
|
74
|
+
end
|
75
|
+
|
76
|
+
factory :user_with_email, :class => User, :traits => [:email] do
|
77
|
+
name "Bill"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "the parent class" do
|
83
|
+
subject { FactoryGirl.create(:user) }
|
84
|
+
its(:name) { should == "John" }
|
85
|
+
its(:gender) { should be_nil }
|
86
|
+
it { should_not be_admin }
|
87
|
+
end
|
88
|
+
|
89
|
+
context "the child class with one trait" do
|
90
|
+
subject { FactoryGirl.create(:admin) }
|
91
|
+
its(:name) { should == "John" }
|
92
|
+
its(:gender) { should be_nil }
|
93
|
+
it { should be_admin }
|
94
|
+
end
|
95
|
+
|
96
|
+
context "the other child class with one trait" do
|
97
|
+
subject { FactoryGirl.create(:female) }
|
98
|
+
its(:name) { should == "Jane" }
|
99
|
+
its(:gender) { should == "Female" }
|
100
|
+
it { should_not be_admin }
|
101
|
+
end
|
102
|
+
|
103
|
+
context "the child with multiple traits" do
|
104
|
+
subject { FactoryGirl.create(:female_admin) }
|
105
|
+
its(:name) { should == "Jane" }
|
106
|
+
its(:gender) { should == "Female" }
|
107
|
+
it { should be_admin }
|
108
|
+
end
|
109
|
+
|
110
|
+
context "the child with multiple traits and overridden attributes" do
|
111
|
+
subject { FactoryGirl.create(:female_admin, :name => "Jill", :gender => nil) }
|
112
|
+
its(:name) { should == "Jill" }
|
113
|
+
its(:gender) { should be_nil }
|
114
|
+
it { should be_admin }
|
115
|
+
end
|
116
|
+
|
117
|
+
context "the child with multiple traits who override the same attribute" do
|
118
|
+
context "when the male assigns name after female" do
|
119
|
+
subject { FactoryGirl.create(:male_after_female_admin) }
|
120
|
+
its(:name) { should == "Joe" }
|
121
|
+
its(:gender) { should == "Male" }
|
122
|
+
it { should be_admin }
|
123
|
+
end
|
124
|
+
|
125
|
+
context "when the female assigns name after male" do
|
126
|
+
subject { FactoryGirl.create(:female_after_male_admin) }
|
127
|
+
its(:name) { should == "Jane" }
|
128
|
+
its(:gender) { should == "Female" }
|
129
|
+
it { should be_admin }
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
context "child class with scoped trait and inherited trait" do
|
134
|
+
subject { FactoryGirl.create(:female_admin_judy) }
|
135
|
+
its(:name) { should == "Judy" }
|
136
|
+
its(:gender) { should == "Female" }
|
137
|
+
it { should be_admin }
|
138
|
+
end
|
139
|
+
|
140
|
+
context "factory using global trait" do
|
141
|
+
subject { FactoryGirl.create(:user_with_email) }
|
142
|
+
its(:name) { should == "Bill" }
|
143
|
+
its(:email) { should == "Bill@example.com"}
|
144
|
+
end
|
145
|
+
|
146
|
+
context "factory created with alternate syntax for specifying trait" do
|
147
|
+
subject { FactoryGirl.create(:male_user) }
|
148
|
+
its(:gender) { should == "Male" }
|
149
|
+
end
|
150
|
+
|
151
|
+
context "factory created with alternate syntax where trait name and attribute are the same" do
|
152
|
+
subject { FactoryGirl.create(:great_user) }
|
153
|
+
its(:great) { should == "GREAT!!!" }
|
154
|
+
end
|
155
|
+
|
156
|
+
context "factory created with alternate syntax where trait name and attribute are the same and attribute is overridden" do
|
157
|
+
subject { FactoryGirl.create(:great_user, :great => "SORT OF!!!") }
|
158
|
+
its(:great) { should == "SORT OF!!!" }
|
159
|
+
end
|
160
|
+
|
161
|
+
context "child factory created where trait attributes are inherited" do
|
162
|
+
subject { FactoryGirl.create(:child_male_user) }
|
163
|
+
its(:gender) { should == "Male" }
|
164
|
+
its(:date_of_birth) { should == Date.parse("1/1/2000") }
|
165
|
+
end
|
166
|
+
|
167
|
+
context "factory outside of scope" do
|
168
|
+
subject { FactoryGirl.create(:user_without_admin_scoping) }
|
169
|
+
it { expect { subject }.to raise_error(ArgumentError, "Not registered: admin_trait") }
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe FactoryGirl::AttributeList, "#define_attribute" do
|
4
|
+
let(:static_attribute) { FactoryGirl::Attribute::Static.new(:full_name, "value") }
|
5
|
+
let(:dynamic_attribute) { FactoryGirl::Attribute::Dynamic.new(:email, lambda {|u| "#{u.full_name}@example.com" }) }
|
6
|
+
|
7
|
+
it "maintains a list of attributes" do
|
8
|
+
subject.define_attribute(static_attribute)
|
9
|
+
subject.to_a.should == [static_attribute]
|
10
|
+
|
11
|
+
subject.define_attribute(dynamic_attribute)
|
12
|
+
subject.to_a.should == [static_attribute, dynamic_attribute]
|
13
|
+
end
|
14
|
+
|
15
|
+
it "raises if an attribute has already been defined" do
|
16
|
+
expect {
|
17
|
+
2.times { subject.define_attribute(static_attribute) }
|
18
|
+
}.to raise_error(FactoryGirl::AttributeDefinitionError, "Attribute already defined: full_name")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe FactoryGirl::AttributeList, "#attribute_defined?" do
|
23
|
+
let(:static_attribute) { FactoryGirl::Attribute::Static.new(:full_name, "value") }
|
24
|
+
let(:callback_attribute) { FactoryGirl::Attribute::Callback.new(:after_create, lambda { }) }
|
25
|
+
let(:static_attribute_named_after_create) { FactoryGirl::Attribute::Static.new(:after_create, "funky!") }
|
26
|
+
|
27
|
+
it "knows if an attribute has been defined" do
|
28
|
+
subject.attribute_defined?(static_attribute.name).should == false
|
29
|
+
|
30
|
+
subject.define_attribute(static_attribute)
|
31
|
+
|
32
|
+
subject.attribute_defined?(static_attribute.name).should == true
|
33
|
+
subject.attribute_defined?(:undefined_attribute).should == false
|
34
|
+
end
|
35
|
+
|
36
|
+
it "doesn't reference callbacks" do
|
37
|
+
subject.define_attribute(callback_attribute)
|
38
|
+
|
39
|
+
subject.attribute_defined?(:after_create).should == false
|
40
|
+
|
41
|
+
subject.define_attribute(static_attribute_named_after_create)
|
42
|
+
subject.attribute_defined?(:after_create).should == true
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
describe FactoryGirl::AttributeList, "#add_callback" do
|
47
|
+
let(:proxy_class) { mock("klass") }
|
48
|
+
let(:proxy) { FactoryGirl::Proxy.new(proxy_class) }
|
49
|
+
let(:valid_callback_names) { [:after_create, :after_build, :after_stub] }
|
50
|
+
let(:invalid_callback_names) { [:before_create, :before_build, :bogus] }
|
51
|
+
|
52
|
+
|
53
|
+
it "allows for defining adding a callback" do
|
54
|
+
subject.add_callback(:after_create) { "Called after_create" }
|
55
|
+
|
56
|
+
subject.first.name.should == :after_create
|
57
|
+
|
58
|
+
subject.first.add_to(proxy)
|
59
|
+
proxy.callbacks[:after_create].first.call.should == "Called after_create"
|
60
|
+
end
|
61
|
+
|
62
|
+
it "allows valid callback names to be assigned" do
|
63
|
+
valid_callback_names.each do |callback_name|
|
64
|
+
expect do
|
65
|
+
subject.add_callback(callback_name) { "great name!" }
|
66
|
+
end.to_not raise_error(FactoryGirl::InvalidCallbackNameError)
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
it "raises if an invalid callback name is assigned" do
|
71
|
+
invalid_callback_names.each do |callback_name|
|
72
|
+
expect do
|
73
|
+
subject.add_callback(callback_name) { "great name!" }
|
74
|
+
end.to raise_error(FactoryGirl::InvalidCallbackNameError, "#{callback_name} is not a valid callback name. Valid callback names are [:after_build, :after_create, :after_stub]")
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
describe FactoryGirl::AttributeList, "#apply_attributes" do
|
80
|
+
let(:full_name_attribute) { FactoryGirl::Attribute::Static.new(:full_name, "John Adams") }
|
81
|
+
let(:city_attribute) { FactoryGirl::Attribute::Static.new(:city, "Boston") }
|
82
|
+
let(:email_attribute) { FactoryGirl::Attribute::Dynamic.new(:email, lambda {|model| "#{model.full_name}@example.com" }) }
|
83
|
+
let(:login_attribute) { FactoryGirl::Attribute::Dynamic.new(:login, lambda {|model| "username-#{model.full_name}" }) }
|
84
|
+
|
85
|
+
it "prepends applied attributes" do
|
86
|
+
subject.define_attribute(full_name_attribute)
|
87
|
+
subject.apply_attributes([city_attribute])
|
88
|
+
subject.to_a.should == [city_attribute, full_name_attribute]
|
89
|
+
end
|
90
|
+
|
91
|
+
it "moves non-static attributes to the end of the list" do
|
92
|
+
subject.define_attribute(full_name_attribute)
|
93
|
+
subject.apply_attributes([city_attribute, email_attribute])
|
94
|
+
subject.to_a.should == [city_attribute, full_name_attribute, email_attribute]
|
95
|
+
end
|
96
|
+
|
97
|
+
it "maintains order of non-static attributes" do
|
98
|
+
subject.define_attribute(full_name_attribute)
|
99
|
+
subject.define_attribute(login_attribute)
|
100
|
+
subject.apply_attributes([city_attribute, email_attribute])
|
101
|
+
subject.to_a.should == [city_attribute, full_name_attribute, email_attribute, login_attribute]
|
102
|
+
end
|
103
|
+
|
104
|
+
it "overwrites attributes that are already defined" do
|
105
|
+
subject.define_attribute(full_name_attribute)
|
106
|
+
attribute_with_same_name = FactoryGirl::Attribute::Static.new(:full_name, "Benjamin Franklin")
|
107
|
+
|
108
|
+
subject.apply_attributes([attribute_with_same_name])
|
109
|
+
subject.to_a.should == [attribute_with_same_name]
|
110
|
+
end
|
111
|
+
end
|
@@ -130,7 +130,7 @@ describe FactoryGirl::DefinitionProxy do
|
|
130
130
|
name = :user
|
131
131
|
attr = 'attribute'
|
132
132
|
stub(attr).name { name }
|
133
|
-
mock(FactoryGirl::Attribute::Implicit).new(name) { attr }
|
133
|
+
mock(FactoryGirl::Attribute::Implicit).new(name, factory) { attr }
|
134
134
|
subject.send(name)
|
135
135
|
factory.attributes.should include(attr)
|
136
136
|
end
|
@@ -25,24 +25,6 @@ describe FactoryGirl::Factory do
|
|
25
25
|
@factory.default_strategy.should == :create
|
26
26
|
end
|
27
27
|
|
28
|
-
it "should not allow the same attribute to be added twice" do
|
29
|
-
lambda {
|
30
|
-
2.times { @factory.define_attribute FactoryGirl::Attribute::Static.new(:name, 'value') }
|
31
|
-
}.should raise_error(FactoryGirl::AttributeDefinitionError)
|
32
|
-
end
|
33
|
-
|
34
|
-
it "should add a callback attribute when defining a callback" do
|
35
|
-
mock(FactoryGirl::Attribute::Callback).new(:after_create, is_a(Proc)) { 'after_create callback' }
|
36
|
-
@factory.add_callback(:after_create) {}
|
37
|
-
@factory.attributes.should include('after_create callback')
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should raise an InvalidCallbackNameError when defining a callback with an invalid name" do
|
41
|
-
lambda{
|
42
|
-
@factory.add_callback(:invalid_callback_name) {}
|
43
|
-
}.should raise_error(FactoryGirl::InvalidCallbackNameError)
|
44
|
-
end
|
45
|
-
|
46
28
|
describe "after adding an attribute" do
|
47
29
|
before do
|
48
30
|
@attribute = "attribute"
|
data/spec/spec_helper.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factory_girl
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.4
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,12 +9,12 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-08-
|
12
|
+
date: 2011-08-12 00:00:00.000000000 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: rcov
|
17
|
-
requirement: &
|
17
|
+
requirement: &2152563020 !ruby/object:Gem::Requirement
|
18
18
|
none: false
|
19
19
|
requirements:
|
20
20
|
- - ! '>='
|
@@ -22,10 +22,10 @@ dependencies:
|
|
22
22
|
version: '0'
|
23
23
|
type: :development
|
24
24
|
prerelease: false
|
25
|
-
version_requirements: *
|
25
|
+
version_requirements: *2152563020
|
26
26
|
- !ruby/object:Gem::Dependency
|
27
27
|
name: rspec
|
28
|
-
requirement: &
|
28
|
+
requirement: &2152562560 !ruby/object:Gem::Requirement
|
29
29
|
none: false
|
30
30
|
requirements:
|
31
31
|
- - ! '>='
|
@@ -33,10 +33,10 @@ dependencies:
|
|
33
33
|
version: '0'
|
34
34
|
type: :development
|
35
35
|
prerelease: false
|
36
|
-
version_requirements: *
|
36
|
+
version_requirements: *2152562560
|
37
37
|
- !ruby/object:Gem::Dependency
|
38
38
|
name: cucumber
|
39
|
-
requirement: &
|
39
|
+
requirement: &2152562040 !ruby/object:Gem::Requirement
|
40
40
|
none: false
|
41
41
|
requirements:
|
42
42
|
- - ! '>='
|
@@ -44,10 +44,10 @@ dependencies:
|
|
44
44
|
version: '0'
|
45
45
|
type: :development
|
46
46
|
prerelease: false
|
47
|
-
version_requirements: *
|
47
|
+
version_requirements: *2152562040
|
48
48
|
- !ruby/object:Gem::Dependency
|
49
49
|
name: activerecord
|
50
|
-
requirement: &
|
50
|
+
requirement: &2152561440 !ruby/object:Gem::Requirement
|
51
51
|
none: false
|
52
52
|
requirements:
|
53
53
|
- - ~>
|
@@ -55,10 +55,10 @@ dependencies:
|
|
55
55
|
version: 2.3.5
|
56
56
|
type: :development
|
57
57
|
prerelease: false
|
58
|
-
version_requirements: *
|
58
|
+
version_requirements: *2152561440
|
59
59
|
- !ruby/object:Gem::Dependency
|
60
60
|
name: activerecord
|
61
|
-
requirement: &
|
61
|
+
requirement: &2152560840 !ruby/object:Gem::Requirement
|
62
62
|
none: false
|
63
63
|
requirements:
|
64
64
|
- - ~>
|
@@ -66,10 +66,10 @@ dependencies:
|
|
66
66
|
version: 3.0.0.beta3
|
67
67
|
type: :development
|
68
68
|
prerelease: false
|
69
|
-
version_requirements: *
|
69
|
+
version_requirements: *2152560840
|
70
70
|
- !ruby/object:Gem::Dependency
|
71
71
|
name: rr
|
72
|
-
requirement: &
|
72
|
+
requirement: &2152560400 !ruby/object:Gem::Requirement
|
73
73
|
none: false
|
74
74
|
requirements:
|
75
75
|
- - ! '>='
|
@@ -77,10 +77,10 @@ dependencies:
|
|
77
77
|
version: '0'
|
78
78
|
type: :development
|
79
79
|
prerelease: false
|
80
|
-
version_requirements: *
|
80
|
+
version_requirements: *2152560400
|
81
81
|
- !ruby/object:Gem::Dependency
|
82
82
|
name: sqlite3
|
83
|
-
requirement: &
|
83
|
+
requirement: &2152530400 !ruby/object:Gem::Requirement
|
84
84
|
none: false
|
85
85
|
requirements:
|
86
86
|
- - ! '>='
|
@@ -88,10 +88,10 @@ dependencies:
|
|
88
88
|
version: '0'
|
89
89
|
type: :development
|
90
90
|
prerelease: false
|
91
|
-
version_requirements: *
|
91
|
+
version_requirements: *2152530400
|
92
92
|
- !ruby/object:Gem::Dependency
|
93
93
|
name: aruba
|
94
|
-
requirement: &
|
94
|
+
requirement: &2152529980 !ruby/object:Gem::Requirement
|
95
95
|
none: false
|
96
96
|
requirements:
|
97
97
|
- - ! '>='
|
@@ -99,7 +99,7 @@ dependencies:
|
|
99
99
|
version: '0'
|
100
100
|
type: :development
|
101
101
|
prerelease: false
|
102
|
-
version_requirements: *
|
102
|
+
version_requirements: *2152529980
|
103
103
|
description: ! "factory_girl provides a framework and DSL for defining and\n using
|
104
104
|
factories - less error-prone, more explicit, and\n all-around
|
105
105
|
easier to work with than fixtures."
|
@@ -124,7 +124,9 @@ files:
|
|
124
124
|
- lib/factory_girl/attribute/implicit.rb
|
125
125
|
- lib/factory_girl/attribute/sequence.rb
|
126
126
|
- lib/factory_girl/attribute/static.rb
|
127
|
+
- lib/factory_girl/attribute/trait.rb
|
127
128
|
- lib/factory_girl/attribute.rb
|
129
|
+
- lib/factory_girl/attribute_list.rb
|
128
130
|
- lib/factory_girl/definition_proxy.rb
|
129
131
|
- lib/factory_girl/deprecated.rb
|
130
132
|
- lib/factory_girl/factory.rb
|
@@ -146,11 +148,13 @@ files:
|
|
146
148
|
- lib/factory_girl/syntax/sham.rb
|
147
149
|
- lib/factory_girl/syntax/vintage.rb
|
148
150
|
- lib/factory_girl/syntax.rb
|
151
|
+
- lib/factory_girl/trait.rb
|
149
152
|
- lib/factory_girl/version.rb
|
150
153
|
- lib/factory_girl.rb
|
151
154
|
- spec/acceptance/acceptance_helper.rb
|
152
155
|
- spec/acceptance/attribute_aliases_spec.rb
|
153
156
|
- spec/acceptance/attributes_for_spec.rb
|
157
|
+
- spec/acceptance/attributes_ordered_spec.rb
|
154
158
|
- spec/acceptance/build_list_spec.rb
|
155
159
|
- spec/acceptance/build_spec.rb
|
156
160
|
- spec/acceptance/build_stubbed_spec.rb
|
@@ -160,6 +164,7 @@ files:
|
|
160
164
|
- spec/acceptance/default_strategy_spec.rb
|
161
165
|
- spec/acceptance/definition_spec.rb
|
162
166
|
- spec/acceptance/definition_without_block_spec.rb
|
167
|
+
- spec/acceptance/overrides_spec.rb
|
163
168
|
- spec/acceptance/parent_spec.rb
|
164
169
|
- spec/acceptance/sequence_spec.rb
|
165
170
|
- spec/acceptance/syntax/blueprint_spec.rb
|
@@ -167,6 +172,7 @@ files:
|
|
167
172
|
- spec/acceptance/syntax/make_spec.rb
|
168
173
|
- spec/acceptance/syntax/sham_spec.rb
|
169
174
|
- spec/acceptance/syntax/vintage_spec.rb
|
175
|
+
- spec/acceptance/traits_spec.rb
|
170
176
|
- spec/factory_girl/aliases_spec.rb
|
171
177
|
- spec/factory_girl/attribute/association_spec.rb
|
172
178
|
- spec/factory_girl/attribute/callback_spec.rb
|
@@ -174,6 +180,7 @@ files:
|
|
174
180
|
- spec/factory_girl/attribute/implicit_spec.rb
|
175
181
|
- spec/factory_girl/attribute/sequence_spec.rb
|
176
182
|
- spec/factory_girl/attribute/static_spec.rb
|
183
|
+
- spec/factory_girl/attribute_list_spec.rb
|
177
184
|
- spec/factory_girl/attribute_spec.rb
|
178
185
|
- spec/factory_girl/definition_proxy_spec.rb
|
179
186
|
- spec/factory_girl/deprecated_spec.rb
|
@@ -224,6 +231,7 @@ summary: factory_girl provides a framework and DSL for defining and using model
|
|
224
231
|
test_files:
|
225
232
|
- spec/acceptance/attribute_aliases_spec.rb
|
226
233
|
- spec/acceptance/attributes_for_spec.rb
|
234
|
+
- spec/acceptance/attributes_ordered_spec.rb
|
227
235
|
- spec/acceptance/build_list_spec.rb
|
228
236
|
- spec/acceptance/build_spec.rb
|
229
237
|
- spec/acceptance/build_stubbed_spec.rb
|
@@ -233,6 +241,7 @@ test_files:
|
|
233
241
|
- spec/acceptance/default_strategy_spec.rb
|
234
242
|
- spec/acceptance/definition_spec.rb
|
235
243
|
- spec/acceptance/definition_without_block_spec.rb
|
244
|
+
- spec/acceptance/overrides_spec.rb
|
236
245
|
- spec/acceptance/parent_spec.rb
|
237
246
|
- spec/acceptance/sequence_spec.rb
|
238
247
|
- spec/acceptance/syntax/blueprint_spec.rb
|
@@ -240,6 +249,7 @@ test_files:
|
|
240
249
|
- spec/acceptance/syntax/make_spec.rb
|
241
250
|
- spec/acceptance/syntax/sham_spec.rb
|
242
251
|
- spec/acceptance/syntax/vintage_spec.rb
|
252
|
+
- spec/acceptance/traits_spec.rb
|
243
253
|
- spec/factory_girl/aliases_spec.rb
|
244
254
|
- spec/factory_girl/attribute/association_spec.rb
|
245
255
|
- spec/factory_girl/attribute/callback_spec.rb
|
@@ -247,6 +257,7 @@ test_files:
|
|
247
257
|
- spec/factory_girl/attribute/implicit_spec.rb
|
248
258
|
- spec/factory_girl/attribute/sequence_spec.rb
|
249
259
|
- spec/factory_girl/attribute/static_spec.rb
|
260
|
+
- spec/factory_girl/attribute_list_spec.rb
|
250
261
|
- spec/factory_girl/attribute_spec.rb
|
251
262
|
- spec/factory_girl/definition_proxy_spec.rb
|
252
263
|
- spec/factory_girl/deprecated_spec.rb
|