modelfactory 0.7.0 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
data/History.txt CHANGED
@@ -1,3 +1,7 @@
1
+ == 0.8.0 2008-12-10
2
+
3
+ * added the ability to specify multiple named types of defaults
4
+
1
5
  == 0.7.0 2008-11-11
2
6
 
3
7
  * Documentation and rubygem
data/README.txt CHANGED
@@ -3,6 +3,9 @@
3
3
  ModelFactory is a module designed to replace the use of fixtures for testing
4
4
  Rails applications.
5
5
 
6
+ The best explanation for the motivation behind ModelFactory (and the inspiration
7
+ for this module) comes from Dan Manges' blog: http://www.dcmanges.com/blog/38
8
+
6
9
  The idea is that instead of keeping your test data in a nearly opaque fixture
7
10
  file, you generate data in the test itself using a custom factory API designed
8
11
  for your test environment.
@@ -16,13 +19,18 @@ the database.
16
19
 
17
20
  === A Note About Defaults
18
21
 
19
- When writing tests that use factory-generated objects, it's important never
20
- to depend on default values in your test assertions. If you depend on defaults
21
- in your tests they become more fragile and the intention is harder to discern.
22
+ The purpose of default values is to generate valid instances, not to serve as
23
+ replacements for fixture data. When writing tests that use factory-generated
24
+ objects, it's important never to depend on default values in your test assertions.
25
+ If you depend on defaults in your tests they become more fragile and the intention
26
+ is harder to discern. Alway override values you care about when using factory objects.
22
27
 
23
28
  If you find yourself repeating the same initialization to avoid using defaults,
24
29
  consider whether it would be appropriate to add a custom toplevel method to
25
- your factory module that includes this initialization.
30
+ your factory module that includes this initialization. You can also specify
31
+ multiple named types of defaults, described below. Be aware that both of these
32
+ techniques should be used sparingly, as they can have some of the same issues
33
+ as fixtures.
26
34
 
27
35
  === A Note About ID Generation
28
36
 
@@ -80,6 +88,36 @@ Then in your tests you use Factory methods to instantiate your test objects:
80
88
  assert !user.likes_blue?
81
89
  end
82
90
 
91
+ You can also specify types of models in your calls to defaults, but be careful. This can
92
+ easily start to become a lot like fixtures:
93
+
94
+ module Factory
95
+ extend ModelFactory
96
+
97
+ default User, :joined {
98
+ :first_name => 'Harry',
99
+ :last_name => 'Manchester',
100
+ :joined => true,
101
+ :set_password => true,
102
+ }
103
+
104
+ default User, :unjoined {
105
+ :first_name => 'Harry',
106
+ :last_name => 'Manchester',
107
+ :joined => false,
108
+ :set_password => false,
109
+ }
110
+ end
111
+
112
+ Then in your test:
113
+
114
+ def test_something
115
+ user1 = Factory.create_joined_user(:first_name => 'Bill')
116
+ user2 = Factory.create_unjoined_user(:first_name => 'Sandy')
117
+ assert user1.joined?
118
+ assert !user2.joined?
119
+ end
120
+
83
121
  == Installing ModelFactory
84
122
 
85
123
  sudo gem install modelfactory
data/lib/model_factory.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'rubygems'
1
2
  require 'active_record'
2
3
 
3
4
  module ModelFactory
@@ -12,9 +13,12 @@ module ModelFactory
12
13
  # object as a dependency use the special method default_* instead of
13
14
  # create_* or new_*.
14
15
  #
15
- def default(class_type, defaults={})
16
+ def default(class_type, *args)
17
+ defaults = args.pop || {}
18
+ prefix = args.first
16
19
  class_name = class_type.name.demodulize.underscore
17
-
20
+ class_name = "#{prefix}_#{class_name}" if prefix
21
+
18
22
  (class << self; self; end).module_eval do
19
23
  define_method "create_#{class_name}" do |*args|
20
24
  attributes = args.first || {}
@@ -78,10 +82,8 @@ module ModelFactory
78
82
  if protected_attrs or accessible_attrs
79
83
  attributes.each do |key, value|
80
84
  # Support symbols and strings.
81
- [key, key.to_s].each do |attr|
82
- next if protected_attrs and not protected_attrs.include?(attr)
83
- next if accessible_attrs and accessible_attrs.include?(attr)
84
- end
85
+ next if protected_attrs and not (protected_attrs.include?(key) or protected_attrs.include?(key.to_s))
86
+ next if accessible_attrs and (accessible_attrs.include?(key) or accessible_attrs.include?(key.to_s))
85
87
  modified = true
86
88
  instance.send("#{key}=", value)
87
89
  end
@@ -1,7 +1,7 @@
1
1
  module ModelFactory #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
- MINOR = 7
4
+ MINOR = 8
5
5
  TINY = 0
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: modelfactory
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.7.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Balthrop
@@ -10,7 +10,7 @@ autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
12
 
13
- date: 2008-11-13 00:00:00 -08:00
13
+ date: 2008-12-10 00:00:00 -08:00
14
14
  default_executable:
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
@@ -73,7 +73,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
73
73
  requirements: []
74
74
 
75
75
  rubyforge_project: modelfactory
76
- rubygems_version: 1.2.0
76
+ rubygems_version: 1.3.1
77
77
  signing_key:
78
78
  specification_version: 2
79
79
  summary: A replacement for fixtures.