factory_girl 2.0.4 → 2.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (71) hide show
  1. data/CONTRIBUTION_GUIDELINES.md +1 -0
  2. data/GETTING_STARTED.md +28 -4
  3. data/Gemfile +2 -1
  4. data/Gemfile.lock +6 -2
  5. data/features/factory_girl_steps.feature +17 -0
  6. data/features/step_definitions/database_steps.rb +22 -0
  7. data/features/support/factories.rb +13 -0
  8. data/features/support/test.db +0 -0
  9. data/lib/factory_girl/aliases.rb +1 -3
  10. data/lib/factory_girl/attribute.rb +16 -8
  11. data/lib/factory_girl/attribute/association.rb +0 -3
  12. data/lib/factory_girl/attribute/callback.rb +0 -2
  13. data/lib/factory_girl/attribute/dynamic.rb +1 -3
  14. data/lib/factory_girl/attribute/static.rb +1 -1
  15. data/lib/factory_girl/attribute_list.rb +30 -9
  16. data/lib/factory_girl/factory.rb +1 -1
  17. data/lib/factory_girl/proxy.rb +7 -5
  18. data/lib/factory_girl/proxy/attributes_for.rb +8 -3
  19. data/lib/factory_girl/proxy/build.rb +12 -3
  20. data/lib/factory_girl/proxy/stub.rb +12 -3
  21. data/lib/factory_girl/sequence.rb +2 -2
  22. data/lib/factory_girl/step_definitions.rb +3 -2
  23. data/lib/factory_girl/version.rb +1 -1
  24. data/spec/acceptance/attribute_aliases_spec.rb +0 -1
  25. data/spec/acceptance/attributes_for_spec.rb +0 -1
  26. data/spec/acceptance/attributes_ordered_spec.rb +24 -6
  27. data/spec/acceptance/build_list_spec.rb +0 -1
  28. data/spec/acceptance/build_spec.rb +0 -1
  29. data/spec/acceptance/build_stubbed_spec.rb +0 -1
  30. data/spec/acceptance/callbacks_spec.rb +0 -1
  31. data/spec/acceptance/create_list_spec.rb +0 -1
  32. data/spec/acceptance/create_spec.rb +0 -1
  33. data/spec/acceptance/default_strategy_spec.rb +0 -1
  34. data/spec/acceptance/definition_spec.rb +0 -1
  35. data/spec/acceptance/definition_without_block_spec.rb +0 -1
  36. data/spec/acceptance/overrides_spec.rb +0 -1
  37. data/spec/acceptance/parent_spec.rb +18 -1
  38. data/spec/acceptance/sequence_spec.rb +0 -1
  39. data/spec/acceptance/syntax/blueprint_spec.rb +0 -1
  40. data/spec/acceptance/syntax/generate_spec.rb +0 -1
  41. data/spec/acceptance/syntax/make_spec.rb +0 -1
  42. data/spec/acceptance/syntax/sham_spec.rb +0 -1
  43. data/spec/acceptance/syntax/vintage_spec.rb +27 -29
  44. data/spec/acceptance/traits_spec.rb +0 -1
  45. data/spec/acceptance/transient_attributes_spec.rb +68 -0
  46. data/spec/factory_girl/aliases_spec.rb +19 -21
  47. data/spec/factory_girl/attribute/association_spec.rb +16 -24
  48. data/spec/factory_girl/attribute/callback_spec.rb +14 -15
  49. data/spec/factory_girl/attribute/dynamic_spec.rb +41 -45
  50. data/spec/factory_girl/attribute/implicit_spec.rb +18 -30
  51. data/spec/factory_girl/attribute/sequence_spec.rb +11 -13
  52. data/spec/factory_girl/attribute/static_spec.rb +13 -20
  53. data/spec/factory_girl/attribute_list_spec.rb +9 -1
  54. data/spec/factory_girl/attribute_spec.rb +17 -28
  55. data/spec/factory_girl/definition_proxy_spec.rb +131 -82
  56. data/spec/factory_girl/deprecated_spec.rb +15 -36
  57. data/spec/factory_girl/factory_spec.rb +106 -135
  58. data/spec/factory_girl/find_definitions_spec.rb +7 -6
  59. data/spec/factory_girl/proxy/attributes_for_spec.rb +23 -32
  60. data/spec/factory_girl/proxy/build_spec.rb +6 -80
  61. data/spec/factory_girl/proxy/create_spec.rb +24 -89
  62. data/spec/factory_girl/proxy/stub_spec.rb +14 -73
  63. data/spec/factory_girl/proxy_spec.rb +53 -53
  64. data/spec/factory_girl/registry_spec.rb +13 -29
  65. data/spec/factory_girl/sequence_spec.rb +24 -72
  66. data/spec/factory_girl_spec.rb +10 -5
  67. data/spec/spec_helper.rb +5 -79
  68. data/spec/support/macros/define_constant.rb +86 -0
  69. data/spec/support/shared_examples/proxy.rb +99 -0
  70. metadata +34 -20
  71. data/spec/acceptance/acceptance_helper.rb +0 -11
@@ -2,15 +2,16 @@ require 'spec_helper'
2
2
 
3
3
  share_examples_for "finds definitions" do
4
4
  before do
5
- stub(FactoryGirl).load
5
+ FactoryGirl.stubs(:load)
6
6
  FactoryGirl.find_definitions
7
7
  end
8
+
8
9
  subject { FactoryGirl }
9
10
  end
10
11
 
11
12
  RSpec::Matchers.define :load_definitions_from do |file|
12
13
  match do |given|
13
- @has_received = have_received.method_missing(:load, File.expand_path(file))
14
+ @has_received = have_received(:load).with(File.expand_path(file))
14
15
  @has_received.matches?(given)
15
16
  end
16
17
 
@@ -23,7 +24,6 @@ RSpec::Matchers.define :load_definitions_from do |file|
23
24
  end
24
25
  end
25
26
 
26
-
27
27
  describe "definition loading" do
28
28
  def self.in_directory_with_files(*files)
29
29
  before do
@@ -79,10 +79,11 @@ describe "definition loading" do
79
79
  in_directory_with_files File.join(dir, 'factories', 'b.rb'),
80
80
  File.join(dir, 'factories', 'a.rb')
81
81
  it "should load the files in the right order" do
82
- @loaded = []
83
- stub(FactoryGirl).load { |a| @loaded << File.split(a)[-1] }
82
+ FactoryGirl.stubs(:load)
83
+ sorted_load_order = sequence("load order")
84
+ FactoryGirl.expects(:load).with(includes("a.rb")).in_sequence(sorted_load_order)
85
+ FactoryGirl.expects(:load).with(includes("b.rb")).in_sequence(sorted_load_order)
84
86
  FactoryGirl.find_definitions
85
- @loaded.should == ["a.rb", "b.rb"]
86
87
  end
87
88
  end
88
89
 
@@ -1,51 +1,42 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Proxy::AttributesFor do
4
- before do
5
- @proxy = FactoryGirl::Proxy::AttributesFor.new(@class)
6
- end
4
+ let(:proxy_class) { stub("class") }
7
5
 
8
- describe "when asked to associate with another factory" do
9
- before do
10
- stub(FactoryGirl).create
11
- @proxy.associate(:owner, :user, {})
12
- end
6
+ subject { FactoryGirl::Proxy::AttributesFor.new(proxy_class) }
13
7
 
14
- it "should not set a value for the association" do
15
- (@proxy.result(nil).key?(:owner)).should_not be
16
- end
17
- end
8
+ it_should_behave_like "proxy without association support"
18
9
 
19
- it "should return nil when building an association" do
20
- @proxy.association(:user).should be_nil
10
+ it "returns a hash when asked for the result" do
11
+ subject.result(nil).should be_kind_of(Hash)
21
12
  end
22
13
 
23
- it "should not call Factory.create when building an association" do
24
- stub(FactoryGirl).create
25
- @proxy.association(:user).should be_nil
26
- FactoryGirl.should have_received.create.never
27
- end
14
+ context "after associating a factory" do
15
+ let(:attribute) { :owner }
28
16
 
29
- it "should always return nil when building an association" do
30
- @proxy.set(:association, 'x')
31
- @proxy.association(:user).should be_nil
32
- end
17
+ before { subject.associate(attribute, :user, {}) }
33
18
 
34
- it "should return a hash when asked for the result" do
35
- @proxy.result(nil).should be_kind_of(Hash)
19
+ it "doesn't set that key in the resulting hash" do
20
+ subject.result(nil).should_not have_key(attribute)
21
+ end
22
+
23
+ it "returns nil when asked for that attribute" do
24
+ subject.get(attribute).should be_nil
25
+ end
36
26
  end
37
27
 
38
28
  describe "after setting an attribute" do
39
- before do
40
- @proxy.set(:attribute, 'value')
41
- end
29
+ let(:attribute) { :attribute }
30
+ let(:value) { "value" }
31
+
32
+ before { subject.set(attribute, value) }
42
33
 
43
- it "should set that value in the resulting hash" do
44
- @proxy.result(nil)[:attribute].should == 'value'
34
+ it "sets that value in the resulting hash" do
35
+ subject.result(nil)[attribute].should == value
45
36
  end
46
37
 
47
- it "should return that value when asked for that attribute" do
48
- @proxy.get(:attribute).should == 'value'
38
+ it "returns that value when asked for that attribute" do
39
+ subject.get(attribute).should == value
49
40
  end
50
41
  end
51
42
  end
@@ -1,86 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Proxy::Build do
4
- before do
5
- @class = Class.new
6
- @instance = "built-instance"
4
+ let(:instance) { stub("built-instance") }
5
+ let(:proxy_class) { stub("class", :new => instance) }
7
6
 
8
- stub(@class).new { @instance }
9
- stub(@instance).attribute { 'value' }
10
- stub(@instance, :attribute=)
11
- stub(@instance, :owner=)
7
+ subject { FactoryGirl::Proxy::Build.new(proxy_class) }
12
8
 
13
- @proxy = FactoryGirl::Proxy::Build.new(@class)
14
- end
15
-
16
- it "should instantiate the class" do
17
- @class.should have_received.new
18
- end
19
-
20
- describe "when asked to associate with another factory" do
21
- before do
22
- @association = "associated-instance"
23
- @associated_factory = "associated-factory"
24
- stub(FactoryGirl).factory_by_name { @associated_factory }
25
- stub(@associated_factory).run { @association }
26
- @overrides = { 'attr' => 'value' }
27
- @proxy.associate(:owner, :user, @overrides)
28
- end
29
-
30
- it "should create the associated instance" do
31
- @associated_factory.should have_received.run(FactoryGirl::Proxy::Create, @overrides)
32
- end
33
-
34
- it "should set the associated instance" do
35
- @instance.should have_received.method_missing(:owner=, @association)
36
- end
37
- end
38
-
39
- it "should run create when building an association" do
40
- association = "associated-instance"
41
- associated_factory = "associated-factory"
42
- stub(FactoryGirl).factory_by_name { associated_factory }
43
- stub(associated_factory).run { association }
44
- overrides = { 'attr' => 'value' }
45
- @proxy.association(:user, overrides).should == association
46
- associated_factory.should have_received.run(FactoryGirl::Proxy::Create, overrides)
47
- end
48
-
49
- it "should return the built instance when asked for the result" do
50
- @proxy.result(nil).should == @instance
51
- end
52
-
53
- it "should run the :after_build callback when retrieving the result" do
54
- spy = Object.new
55
- stub(spy).foo
56
- @proxy.add_callback(:after_build, proc{ spy.foo })
57
- @proxy.result(nil)
58
- spy.should have_received.foo
59
- end
60
-
61
- describe "when setting an attribute" do
62
- before do
63
- stub(@instance).attribute = 'value'
64
- @proxy.set(:attribute, 'value')
65
- end
66
-
67
- it "should set that value" do
68
- @instance.should have_received.method_missing(:attribute=, 'value')
69
- end
70
- end
71
-
72
- describe "when getting an attribute" do
73
- before do
74
- @result = @proxy.get(:attribute)
75
- end
76
-
77
- it "should ask the built class for the value" do
78
- @instance.should have_received.attribute
79
- end
80
-
81
- it "should return the value for that attribute" do
82
- @result.should == 'value'
83
- end
84
- end
9
+ it_should_behave_like "proxy with association support", FactoryGirl::Proxy::Create
10
+ it_should_behave_like "proxy with standard getters and setters", :attribute_name, "attribute value!"
11
+ it_should_behave_like "proxy with callbacks", :after_build
85
12
  end
86
-
@@ -1,107 +1,42 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Proxy::Create do
4
- before do
5
- @class = Class.new
6
- @instance = "built-instance"
7
4
 
8
- stub(@class).new { @instance }
9
- stub(@instance).attribute { 'value' }
10
- stub(@instance, :attribute=)
11
- stub(@instance, :owner=)
12
- stub(@instance).save!
5
+ let(:instance) { stub("created-instance", :save! => true) }
6
+ let(:proxy_class) { stub("class", :new => instance) }
13
7
 
14
- @proxy = FactoryGirl::Proxy::Create.new(@class)
15
- end
16
-
17
- it "should instantiate the class" do
18
- @class.should have_received.new
19
- end
8
+ subject { FactoryGirl::Proxy::Create.new(proxy_class) }
20
9
 
21
- describe "when asked to associate with another factory" do
22
- before do
23
- @association = "associated-instance"
24
- @associated_factory = "associated-factory"
25
- stub(FactoryGirl).factory_by_name { @associated_factory }
26
- stub(@associated_factory).run { @association }
27
- @overrides = { 'attr' => 'value' }
28
- @proxy.associate(:owner, :user, @overrides)
29
- end
10
+ it_should_behave_like "proxy with association support", FactoryGirl::Proxy::Create
11
+ it_should_behave_like "proxy with standard getters and setters", :attribute_name, "attribute value!"
12
+ it_should_behave_like "proxy with callbacks", :after_build
13
+ it_should_behave_like "proxy with callbacks", :after_create
30
14
 
31
- it "should create the associated instance" do
32
- @associated_factory.should have_received.run(FactoryGirl::Proxy::Create, @overrides)
33
- end
34
-
35
- it "should set the associated instance" do
36
- @instance.should have_received.method_missing(:owner=, @association)
37
- end
38
- end
39
-
40
- it "should run create when building an association" do
41
- association = "associated-instance"
42
- associated_factory = "associated-factory"
43
- stub(FactoryGirl).factory_by_name { associated_factory }
44
- stub(associated_factory).run { association }
45
- overrides = { 'attr' => 'value' }
46
- @proxy.association(:user, overrides).should == association
47
- associated_factory.should have_received.run(FactoryGirl::Proxy::Create, overrides)
48
- end
49
-
50
- describe "when asked for the result" do
51
- before do
52
- @build_spy = Object.new
53
- @create_spy = Object.new
54
- stub(@build_spy).foo
55
- stub(@create_spy).foo
56
- @proxy.add_callback(:after_build, proc{ @build_spy.foo })
57
- @proxy.add_callback(:after_create, proc{ @create_spy.foo })
58
- @result = @proxy.result(nil)
59
- end
60
-
61
- it "should save the instance" do
62
- @instance.should have_received.save!
63
- end
64
-
65
- it "should return the built instance" do
66
- @result.should == @instance
67
- end
68
-
69
- it "should run both the build and the create callbacks" do
70
- @build_spy.should have_received.foo
71
- @create_spy.should have_received.foo
72
- end
15
+ it "saves the instance before returning the result" do
16
+ subject.result(nil)
17
+ instance.should have_received(:save!)
73
18
  end
74
19
 
75
20
  it "runs a custom create block" do
76
- block = 'custom create block'
77
- stub(block).call
78
- stub(@instance).save! { raise }
79
- instance = @proxy.result(block)
80
- block.should have_received.call(instance)
21
+ block = stub('custom create block', :call => nil)
22
+ subject.result(block)
23
+ block.should have_received(:call).with(instance)
24
+ instance.should have_received(:save!).never
81
25
  end
82
26
 
83
- describe "when setting an attribute" do
84
- before do
85
- @proxy.set(:attribute, 'value')
86
- end
87
-
88
- it "should set that value" do
89
- @instance.should have_received.method_missing(:attribute=, 'value')
90
- end
91
- end
27
+ context "callback execution order" do
28
+ let(:after_build_callback) { stub("after_build callback", :foo => nil) }
29
+ let(:after_create_callback) { stub("after_create callback", :foo => nil) }
30
+ let(:callback_sequence) { sequence("after_* callbacks") }
92
31
 
93
- describe "when getting an attribute" do
94
- before do
95
- @result = @proxy.get(:attribute)
96
- end
32
+ it "runs after_build callbacks before after_create callbacks" do
33
+ subject.add_callback(:after_build, proc { after_build_callback.foo })
34
+ subject.add_callback(:after_create, proc { after_create_callback.foo })
97
35
 
98
- it "should ask the built class for the value" do
99
- @instance.should have_received.attribute
100
- end
36
+ after_build_callback.expects(:foo).once.in_sequence(callback_sequence)
37
+ after_create_callback.expects(:foo).once.in_sequence(callback_sequence)
101
38
 
102
- it "should return the value for that attribute" do
103
- @result.should == 'value'
39
+ subject.result(nil)
104
40
  end
105
41
  end
106
42
  end
107
-
@@ -1,84 +1,25 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Proxy::Stub do
4
- before do
5
- @class = "class"
6
- @instance = "instance"
7
- stub(@class).new { @instance }
8
- stub(@instance, :id=)
9
- stub(@instance).id { 42 }
10
- stub(@instance).reload { @instance.connection.reload }
4
+ let(:instance) { stub("instance", :id= => nil, :id => 42) }
5
+ let(:proxy_class) { stub("class", :new => instance) }
11
6
 
12
- @stub = FactoryGirl::Proxy::Stub.new(@class)
13
- end
14
-
15
- it "should not be a new record" do
16
- @stub.result(nil).should_not be_new_record
17
- end
18
-
19
- it "should be persisted" do
20
- @stub.result(nil).should be_persisted
21
- end
22
-
23
- it "should not be able to connect to the database" do
24
- lambda { @stub.result(nil).reload }.should raise_error(RuntimeError)
25
- end
26
-
27
- describe "when a user factory exists" do
28
- before do
29
- @user = "user"
30
- stub(FactoryGirl).factory_by_name { @associated_factory }
31
- @associated_factory = 'associate-factory'
32
- end
33
-
34
- describe "when asked to associate with another factory" do
35
- before do
36
- stub(@instance).owner { @user }
37
- mock(@associated_factory).run(FactoryGirl::Proxy::Stub, {}) { @user }
38
- mock(@stub).set(:owner, @user)
39
-
40
- @stub.associate(:owner, :user, {})
41
- end
7
+ subject { FactoryGirl::Proxy::Stub.new(proxy_class) }
42
8
 
43
- it "should set a value for the association" do
44
- @stub.result(nil).owner.should == @user
45
- end
46
- end
47
-
48
- it "should return the association when building one" do
49
- mock(@associated_factory).run(FactoryGirl::Proxy::Stub, {}) { @user }
50
- @stub.association(:user).should == @user
51
- end
9
+ it_should_behave_like "proxy with association support", FactoryGirl::Proxy::Stub
10
+ it_should_behave_like "proxy with standard getters and setters", :attribute_name, "attribute value!"
11
+ it_should_behave_like "proxy with callbacks", :after_stub
52
12
 
53
- describe "when asked for the result" do
54
- it "should return the actual instance" do
55
- @stub.result(nil).should == @instance
56
- end
13
+ context "asking for a result" do
14
+ it { subject.result(nil).should_not be_new_record }
15
+ it { subject.result(nil).should be_persisted }
57
16
 
58
- it "should run the :after_stub callback" do
59
- @spy = Object.new
60
- stub(@spy).foo
61
- @stub.add_callback(:after_stub, proc{ @spy.foo })
62
- @stub.result(nil)
63
- @spy.should have_received.foo
17
+ [:save, :destroy, :connection, :reload, :update_attribute].each do |database_method|
18
+ it "raises when attempting to connect to the database by calling #{database_method}" do
19
+ expect do
20
+ subject.result(nil).send(database_method)
21
+ end.to raise_error(RuntimeError, "stubbed models are not allowed to access the database")
64
22
  end
65
23
  end
66
24
  end
67
-
68
- describe "with an existing attribute" do
69
- before do
70
- @value = "value"
71
- mock(@instance).send(:attribute) { @value }
72
- mock(@instance).send(:attribute=, @value)
73
- @stub.set(:attribute, @value)
74
- end
75
-
76
- it "should to the resulting object" do
77
- @stub.attribute.should == 'value'
78
- end
79
-
80
- it "should return that value when asked for that attribute" do
81
- @stub.get(:attribute).should == @value
82
- end
83
- end
84
25
  end
@@ -1,84 +1,84 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe FactoryGirl::Proxy do
4
- before do
5
- @proxy = FactoryGirl::Proxy.new(Class.new)
6
- end
4
+ subject { FactoryGirl::Proxy.new(Class.new) }
7
5
 
8
- it "should do nothing when asked to set an attribute to a value" do
9
- lambda { @proxy.set(:name, 'a name') }.should_not raise_error
10
- end
6
+ it_should_behave_like "proxy without association support"
11
7
 
12
- it "should return nil when asked for an attribute" do
13
- @proxy.get(:name).should be_nil
8
+ it "doesn't raise when assigning a value to an attribute" do
9
+ expect { subject.set(:name, "a name") }.to_not raise_error
14
10
  end
15
11
 
16
- it "should call get for a missing method" do
17
- mock(@proxy).get(:name) { "it's a name" }
18
- @proxy.name.should == "it's a name"
12
+ it "returns nil for an attribute without a value" do
13
+ subject.get(:name).should be_nil
19
14
  end
20
15
 
21
- it "should do nothing when asked to associate with another factory" do
22
- lambda { @proxy.associate(:owner, :user, {}) }.should_not raise_error
16
+ it "calls get for a missing method" do
17
+ subject.stubs(:get).with(:name).returns("it's a name")
18
+ subject.name.should == "it's a name"
23
19
  end
24
20
 
25
- it "should raise an error when asked for the result" do
26
- lambda { @proxy.result(nil) }.should raise_error(NotImplementedError)
21
+ it "raises an error when asking for the result" do
22
+ expect { subject.result(nil) }.to raise_error(NotImplementedError)
27
23
  end
28
24
 
29
25
  describe "when adding callbacks" do
30
- before do
31
- @first_block = proc{ 'block 1' }
32
- @second_block = proc{ 'block 2' }
33
- end
34
- it "should add a callback" do
35
- @proxy.add_callback(:after_create, @first_block)
36
- @proxy.callbacks[:after_create].should be_eql([@first_block])
26
+ let(:block_1) { proc { "block 1" } }
27
+ let(:block_2) { proc { "block 2" } }
28
+
29
+ it "adds a callback" do
30
+ subject.add_callback(:after_create, block_1)
31
+ subject.callbacks[:after_create].should be_eql([block_1])
37
32
  end
38
33
 
39
- it "should add multiple callbacks of the same name" do
40
- @proxy.add_callback(:after_create, @first_block)
41
- @proxy.add_callback(:after_create, @second_block)
42
- @proxy.callbacks[:after_create].should be_eql([@first_block, @second_block])
34
+ it "adds multiple callbacks of the same name" do
35
+ subject.add_callback(:after_create, block_1)
36
+ subject.add_callback(:after_create, block_2)
37
+ subject.callbacks[:after_create].should be_eql([block_1, block_2])
43
38
  end
44
39
 
45
- it "should add multiple callbacks of different names" do
46
- @proxy.add_callback(:after_create, @first_block)
47
- @proxy.add_callback(:after_build, @second_block)
48
- @proxy.callbacks[:after_create].should be_eql([@first_block])
49
- @proxy.callbacks[:after_build].should be_eql([@second_block])
40
+ it "adds multiple callbacks with different names" do
41
+ subject.add_callback(:after_create, block_1)
42
+ subject.add_callback(:after_build, block_2)
43
+ subject.callbacks[:after_create].should be_eql([block_1])
44
+ subject.callbacks[:after_build].should be_eql([block_2])
50
45
  end
51
46
  end
52
47
 
53
48
  describe "when running callbacks" do
54
- before do
55
- @first_spy = Object.new
56
- @second_spy = Object.new
57
- stub(@first_spy).foo
58
- stub(@second_spy).foo
49
+ let(:object_1_within_callback) { stub("call_in_create", :foo => true) }
50
+ let(:object_2_within_callback) { stub("call_in_create", :foo => true) }
51
+
52
+ it "runs all callbacks with a given name" do
53
+ subject.add_callback(:after_create, proc { object_1_within_callback.foo })
54
+ subject.add_callback(:after_create, proc { object_2_within_callback.foo })
55
+ subject.run_callbacks(:after_create)
56
+ object_1_within_callback.should have_received(:foo).once
57
+ object_2_within_callback.should have_received(:foo).once
59
58
  end
60
59
 
61
- it "should run all callbacks with a given name" do
62
- @proxy.add_callback(:after_create, proc{ @first_spy.foo })
63
- @proxy.add_callback(:after_create, proc{ @second_spy.foo })
64
- @proxy.run_callbacks(:after_create)
65
- @first_spy.should have_received.foo
66
- @second_spy.should have_received.foo
60
+ it "only runs callbacks with a given name" do
61
+ subject.add_callback(:after_create, proc { object_1_within_callback.foo })
62
+ subject.add_callback(:after_build, proc { object_2_within_callback.foo })
63
+ subject.run_callbacks(:after_create)
64
+ object_1_within_callback.should have_received(:foo).once
65
+ object_2_within_callback.should have_received(:foo).never
67
66
  end
68
67
 
69
- it "should only run callbacks with a given name" do
70
- @proxy.add_callback(:after_create, proc{ @first_spy.foo })
71
- @proxy.add_callback(:after_build, proc{ @second_spy.foo })
72
- @proxy.run_callbacks(:after_create)
73
- @first_spy.should have_received.foo
74
- @second_spy.should_not have_received.foo
68
+ it "passes in the instance if the block takes an argument" do
69
+ subject.instance_variable_set("@instance", object_1_within_callback)
70
+ subject.add_callback(:after_create, proc {|spy| spy.foo })
71
+ subject.run_callbacks(:after_create)
72
+ object_1_within_callback.should have_received(:foo).once
75
73
  end
76
74
 
77
- it "should pass in the instance if the block takes an argument" do
78
- @proxy.instance_variable_set("@instance", @first_spy)
79
- @proxy.add_callback(:after_create, proc{|spy| spy.foo })
80
- @proxy.run_callbacks(:after_create)
81
- @first_spy.should have_received.foo
75
+ it "passes in the instance and the proxy if the block takes two arguments" do
76
+ subject.instance_variable_set("@instance", object_1_within_callback)
77
+ proxy_instance = nil
78
+ subject.add_callback(:after_create, proc {|spy, proxy| spy.foo; proxy_instance = proxy })
79
+ subject.run_callbacks(:after_create)
80
+ object_1_within_callback.should have_received(:foo).once
81
+ proxy_instance.should == subject
82
82
  end
83
83
  end
84
84
  end