caricature 0.2.0 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
data/README CHANGED
@@ -2,28 +2,28 @@ Caricature - Bringing simple mocking to the DLR
2
2
  ===============================================
3
3
 
4
4
  This project aims to make interop between IronRuby objects and .NET objects easier.
5
- The idea is that it integrates nicely with bacon and later rspec and that it transparently lets you mock ironruby ojbects
5
+ The idea is that it integrates nicely with bacon and later rspec and that it transparently lets you isolate ironruby ojbects
6
6
  as well as CLR objects/interfaces.
7
7
  Caricature handles interfaces, interface inheritance, CLR objects, CLR object instances, Ruby classes and instances of Ruby classes.
8
8
 
9
9
  From the start I wanted to do away with names like mock, stub, record, replay, verify etc.
10
10
  Instead I took the advice from Roy Osherhove and went with a name of Isolation for creating a mock.
11
11
 
12
- An Isolation will create what in Rhino.Mocks would be called a DynamicMock (but can be a partial too) :)
12
+ An Isolation will create what in Rhino.Mocks would be called a DynamicMock (but can be a partial too :) )
13
13
  In Moq it would be the Loose mocking strategy.
14
14
 
15
- The naming of the methods for creating mocks is the one that JP Boodhoo proposed WhenToldTo and WasToldTo.
16
- To specify a stub/expectation on a mock you have one and only one way of doing that with the method called when_told_to.
15
+ The naming of the methods for creating isolations is the one that JP Boodhoo proposed WhenToldTo and WasToldTo.
16
+ To specify a stub/expectation on an isolation you have one and only one way of doing that with the method called when_told_to.
17
17
  Then only if you're interested in asserting if a method has been called you can use the was_told_to? method for this.
18
18
 
19
19
 
20
- mock = Isolation.for(Ninja)
21
- mock.when_told_to(:attack) do |exp|
20
+ isolation = Isolation.for(Ninja)
21
+ isolation.when_told_to(:attack) do |exp|
22
22
  exp.with(:shuriken)
23
23
  exp.return(3)
24
24
  end
25
25
 
26
- Battle.new(mock)
26
+ Battle.new(isolation)
27
27
  battle.combat
28
28
 
29
- mock.was_told_to?(:attack).should.be.true?
29
+ isolation.was_told_to?(:attack).should.be.true?
data/README.markdown CHANGED
@@ -13,12 +13,12 @@ An Isolation will create what in Rhino.Mocks would be called a DynamicMock (but
13
13
  In Moq it would be the Loose mocking strategy.
14
14
 
15
15
  The naming of the methods for creating mocks is the one that JP Boodhoo proposed WhenToldTo and WasToldTo.
16
- To specify a stub/expectation on a mock you have one and only one way of doing that with the method called when_told_to.
16
+ To specify a stub/expectation on an isolation you have one and only one way of doing that with the method called when_told_to.
17
17
  Then only if you're interested in asserting if a method has been called you can use the was_told_to? method for this.
18
18
 
19
19
  <pre>
20
- mock = Isolation.for(Ninja)
21
- mock.when_told_to(:attack) do |exp|
20
+ isolation = Isolation.for(Ninja)
21
+ isolation.when_told_to(:attack) do |exp|
22
22
  exp.with(:shuriken)
23
23
  exp.return(3)
24
24
  end
@@ -26,9 +26,14 @@ end
26
26
  Battle.new(mock)
27
27
  battle.combat
28
28
 
29
- mock.was_told_to?(:attack).should.be.true?
29
+ isolation.was_told_to?(:attack).should.be.true?
30
30
  </pre>
31
31
 
32
+ It may be very important to note that when you're going to be isolating CLR classes to be used in other CLR classes
33
+ you still need to obide by the CLR rules. That means if you want to redefine a method you'll need to make sure it's
34
+ marked as virtual. Static types are still governed by static type rules. I'm working on a solution around those
35
+ problems but for the time being this is how it has to be.
36
+
32
37
  License:
33
38
  --------
34
39
 
@@ -0,0 +1,142 @@
1
+ require File.dirname(__FILE__) + "/bacon_helper"
2
+
3
+ describe "Full scenarios" do
4
+
5
+ describe "when isolating CLR interfaces" do
6
+ before do
7
+ @ninja = ClrModels::Ninja.new
8
+ @weapon = Caricature::Isolation.for(ClrModels::IWeapon)
9
+ end
10
+
11
+ it "should work without expectations" do
12
+ @ninja.attack ClrModels::Ninja.new, @weapon
13
+
14
+ @weapon.was_told_to?(:attack).should.be.successful
15
+ end
16
+
17
+ it "should work with an expectation with any arguments" do
18
+ @weapon.when_told_to(:damage).return(5)
19
+
20
+ @ninja.is_killed_by(@weapon).should.be.true?
21
+ @weapon.was_told_to?(:damage).should.be.successful
22
+ end
23
+
24
+ # it "should work with an expectation with any arguments" do
25
+ # @weapon.when_told_to(:damage).return(5)
26
+ #
27
+ # @ninja.is_killed_by(@weapon).should.be.true?
28
+ # @weapon.was_told_to?(:damage).should.be.successful
29
+ # end
30
+
31
+ it "should work with an expectation getting different method call result" do
32
+ @weapon.when_told_to(:damage).return(2)
33
+
34
+ @ninja.is_killed_by(@weapon).should.be.false?
35
+ @weapon.was_told_to?(:damage).should.be.successful
36
+ end
37
+
38
+ it "should work for an assertion on a specific argument" do
39
+ @weapon.when_told_to(:damage).return(2)
40
+
41
+ @ninja.is_killed_by(@weapon).should.be.false?
42
+ @weapon.was_told_to?(:damage).should.be.successful
43
+ end
44
+
45
+ end
46
+
47
+ describe "when isolating CLR classes" do
48
+
49
+ before do
50
+ @weapon = ClrModels::Sword.new
51
+ @ninja = Caricature::Isolation.for(ClrModels::Ninja)
52
+ end
53
+
54
+ it "should work without expectations" do
55
+ result = @weapon.attack @ninja
56
+ result.should.equal 0
57
+
58
+ @ninja.was_told_to?(:survive_attack_with).with(@weapon).should.be.successful
59
+ end
60
+
61
+ it "should work with an expectation for any arguments" do
62
+ @ninja.when_told_to(:survive_attack_with).return(5)
63
+
64
+ result = @weapon.attack @ninja
65
+ result.should.equal 5
66
+
67
+ @ninja.was_told_to?(:survive_attack_with).with(:any).should.be.successful
68
+ end
69
+
70
+ it "should work with an assertion for specific arguments" do
71
+ @ninja.when_told_to(:survive_attack_with) do |method_should|
72
+ method_should.return(5)
73
+ end
74
+
75
+ result = @weapon.attack @ninja
76
+ result.should.equal 5
77
+
78
+ @ninja.was_told_to?(:survive_attack_with).with(@weapon).should.be.successful
79
+ end
80
+
81
+ it "should fail for an assertion with wrong arguments" do
82
+ @ninja.when_told_to(:survive_attack_with) do |method_should|
83
+ method_should.return(5)
84
+ end
85
+
86
+ result = @weapon.attack @ninja
87
+ result.should.equal 5
88
+
89
+ @ninja.
90
+ was_told_to?(:survive_attack_with).
91
+ with(Caricature::Isolation.for(ClrModels::IWeapon)).
92
+ should.not.be.successful
93
+ end
94
+
95
+ end
96
+
97
+ describe "when isolating CLR instances" do
98
+
99
+ before do
100
+ @weapon = ClrModels::Sword.new
101
+ @ninja = Caricature::Isolation.for(ClrModels::Ninja.new)
102
+ end
103
+
104
+ it "should work without expectations" do
105
+ result = @weapon.attack @ninja
106
+ result.should.equal 0
107
+
108
+ @ninja.was_told_to?(:survive_attack_with).with(@weapon).should.be.successful
109
+ end
110
+
111
+ it "should work with an expectation for any arguments" do
112
+ @ninja.when_told_to(:survive_attack_with).return(5)
113
+
114
+ result = @weapon.attack @ninja
115
+ result.should.equal 5
116
+
117
+ @ninja.was_told_to?(:survive_attack_with).with(:any).should.be.successful
118
+ end
119
+
120
+ it "should fail for an assertion for specific arguments" do
121
+ @ninja.when_told_to(:survive_attack_with) do |method_should|
122
+ method_should.return(5)
123
+ end
124
+
125
+ result = @weapon.attack @ninja
126
+ result.should.equal 5
127
+ var = @ninja.was_told_to?(:survive_attack_with).with(:any)
128
+ @ninja.was_told_to?(:survive_attack_with).with(@weapon).should.be.successful
129
+ end
130
+
131
+ it "should allow to delegate the method call to the real instance (partial mock)" do
132
+ @ninja.when_told_to(:survive_attack_with).super_after
133
+
134
+ result = @weapon.attack @ninja
135
+ result.should.equal 6
136
+
137
+ @ninja.was_told_to?(:survive_attack_with).should.be.successful
138
+ end
139
+
140
+ end
141
+
142
+ end
data/spec/interop_spec.rb CHANGED
@@ -30,7 +30,7 @@ describe "Event handling" do
30
30
  describe "for an IR generated interface proxy" do
31
31
 
32
32
  before do
33
- @proxy = Caricature::RecordingClrProxy.new ClrModels::IExposingWarrior
33
+ @proxy = Caricature::ClrIsolator.new ClrModels::IExposingWarrior
34
34
  end
35
35
 
36
36
  # apparently events don't work yet in IronRuby.. keeping this spec here to find out when it does
@@ -59,16 +59,12 @@ describe "Caricature::Isolation" do
59
59
  end
60
60
 
61
61
  it "should create a proxy" do
62
- @isolator.proxy.should.not.be == nil
63
- end
64
-
65
- it "should create the Ruby objects proxy" do
66
- @isolator.proxy.is_clr_proxy?.should.be.false?
62
+ @isolator.should.not.be == nil
67
63
  end
68
64
 
69
65
  describe "when asked to stub a method" do
70
66
 
71
- it "should create an expectation" do
67
+ it "should create an expectation with a block" do
72
68
  nm = "What's in a name"
73
69
  expectation = @isolator.when_told_to(:name) do |cl|
74
70
  cl.return(nm)
@@ -77,41 +73,18 @@ describe "Caricature::Isolation" do
77
73
  expectation.has_return_value?.should.be.true?
78
74
  expectation.return_value.should.equal nm
79
75
  end
80
- end
81
-
82
- end
83
76
 
84
- describe 'when verifying if a call was made' do
85
-
86
- before do
87
- @rec = Caricature::MethodCallRecorder.new
88
- @rec.record_call :my_method
89
- @rec.record_call :my_method, 1, 2, 3
90
- @proxy = Caricature::RecordingProxy.new(Soldier, @rec)
91
- end
92
-
93
- it "should be successful with any arguments allowed" do
94
- iso = Caricature::Isolation.new(@proxy, @rec)
95
- iso.was_told_to?(:my_method).should.be.true?
96
- end
97
-
98
- it "should be successful with a correct set of arguments provided for my_method" do
99
- iso = Caricature::Isolation.new(@proxy, @rec)
100
- iso.was_told_to?(:my_method){ |ver| ver.with(1, 2, 3) }.should.be.true?
101
- end
102
-
103
- it "should be unsuccessful when a wrong set of arguments is provided" do
104
- iso = Caricature::Isolation.new(@proxy, @rec)
105
- iso.was_told_to?(:my_method){|ver| ver.with(1, 3, 6) }.should.be.false?
106
- end
107
-
108
- it "should be unsuccessful when the wrong method name is provided" do
109
- iso = Caricature::Isolation.new(@proxy, @rec)
110
- iso.was_told_to?(:some_method).should.be.false?
77
+ it "should create an expectation without a block" do
78
+ nm = "What's in a name"
79
+ expectation = @isolator.when_told_to(:name).return(nm)
80
+ expectation.method_name.should.equal :name
81
+ expectation.has_return_value?.should.be.true?
82
+ expectation.return_value.should.equal nm
83
+ end
111
84
  end
112
85
 
113
86
  end
114
-
87
+
115
88
  describe "when creating an isolation for CLR objects" do
116
89
 
117
90
  it "should not raise" do
@@ -127,11 +100,28 @@ describe "Caricature::Isolation" do
127
100
  end
128
101
 
129
102
  it "should create a proxy" do
130
- @isolator.proxy.should.not.be == nil
103
+ @isolator.should.not.be == nil
131
104
  end
132
105
 
133
- it "should create the CLR objects proxy" do
134
- @isolator.proxy.is_clr_proxy?.should.be.true?
106
+ describe "when asked to stub a method" do
107
+
108
+ it "should create an expectation with a block" do
109
+ nm = "What's in a name"
110
+ expectation = @isolator.when_told_to(:name) do |cl|
111
+ cl.return(nm)
112
+ end
113
+ expectation.method_name.should.equal :name
114
+ expectation.has_return_value?.should.be.true?
115
+ expectation.return_value.should.equal nm
116
+ end
117
+
118
+ it "should create an expectation without a block" do
119
+ nm = "What's in a name"
120
+ expectation = @isolator.when_told_to(:name).return(nm)
121
+ expectation.method_name.should.equal :name
122
+ expectation.has_return_value?.should.be.true?
123
+ expectation.return_value.should.equal nm
124
+ end
135
125
  end
136
126
 
137
127
  end
@@ -1,21 +1,14 @@
1
1
  require File.dirname(__FILE__) + "/bacon_helper"
2
2
 
3
- describe "Caricature::RecordingProxy" do
3
+ describe "Caricature::RubyIsolator" do
4
4
 
5
5
  before do
6
6
  @subj = Soldier.new
7
7
  @recorder = Caricature::MethodCallRecorder.new
8
- @proxy = Caricature::RecordingProxy.new(@subj, @recorder)
9
- end
10
-
11
- it "should forward existing methods" do
12
- @proxy.___super___.name.should.equal @subj.name
13
- end
14
-
15
- it "should call to_s on the proxied object" do
16
- @proxy.___super___.to_s.should.equal @subj.to_s
8
+ @proxy = Caricature::RubyIsolator.for(@subj, @recorder)
17
9
  end
18
10
 
11
+
19
12
  describe "when invoking a method" do
20
13
 
21
14
  before do
@@ -48,7 +41,7 @@ describe "Caricature::RecordingClrProxy" do
48
41
  @samurai = ClrModels::Samurai.new
49
42
  @samurai.name = "Nakiro"
50
43
  @recorder = Caricature::MethodCallRecorder.new
51
- @proxy = Caricature::RecordingClrProxy.new(@samurai, @recorder)
44
+ @proxy = Caricature::ClrIsolator.for(@samurai, @recorder)
52
45
  end
53
46
 
54
47
  it "should create a proxy" do
@@ -86,12 +79,13 @@ describe "Caricature::RecordingClrProxy" do
86
79
 
87
80
  before do
88
81
  @recorder = Caricature::MethodCallRecorder.new
89
- @proxy = Caricature::RecordingClrProxy.new(ClrModels::Ninja, @recorder)
82
+ @proxy = Caricature::ClrIsolator.for(ClrModels::Ninja, @recorder)
90
83
  end
91
84
 
92
85
  it "should create a proxy" do
93
- @proxy.___super___.class.should.equal ClrModels::Ninja
94
- @proxy.___super___.id.should.equal 0
86
+
87
+ @proxy.___super___.class.superclass.should.equal ClrModels::Ninja
88
+
95
89
  end
96
90
 
97
91
 
@@ -119,7 +113,7 @@ describe "Caricature::RecordingClrProxy" do
119
113
 
120
114
  before do
121
115
  @recorder = Caricature::MethodCallRecorder.new
122
- @proxy = Caricature::RecordingClrProxy.new(ClrModels::IWarrior, @recorder)
116
+ @proxy = Caricature::ClrInterfaceIsolator.for(ClrModels::IWarrior, @recorder)
123
117
  end
124
118
 
125
119
  it "should create a proxy" do
@@ -163,7 +157,7 @@ describe "Caricature::RecordingClrProxy" do
163
157
 
164
158
  before do
165
159
  @recorder = Caricature::MethodCallRecorder.new
166
- @proxy = Caricature::RecordingClrProxy.new(ClrModels::IExposing, @recorder)
160
+ @proxy = Caricature::ClrInterfaceIsolator.for(ClrModels::IExposing, @recorder)
167
161
  end
168
162
 
169
163
  it "should create an add method for the event" do
@@ -179,7 +173,7 @@ describe "Caricature::RecordingClrProxy" do
179
173
  describe "for CLR interface recursion" do
180
174
 
181
175
  before do
182
- @proxy = Caricature::RecordingClrProxy.new(ClrModels::IExposingWarrior, Caricature::MethodCallRecorder.new)
176
+ @proxy = Caricature::ClrInterfaceIsolator.for(ClrModels::IExposingWarrior, Caricature::MethodCallRecorder.new)
183
177
  end
184
178
 
185
179
  it "should create a method defined on the CLR interface" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caricature
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Porto Carrero
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-05-11 00:00:00 +02:00
12
+ date: 2009-05-15 00:00:00 +02:00
13
13
  default_executable:
14
14
  dependencies: []
15
15
 
@@ -57,8 +57,9 @@ test_files:
57
57
  - spec/bacon_helper.rb
58
58
  - spec/core_ext_spec.rb
59
59
  - spec/expectation_spec.rb
60
+ - spec/integration_spec.rb
60
61
  - spec/interop_spec.rb
61
62
  - spec/isolation_spec.rb
63
+ - spec/isolator_spec.rb
62
64
  - spec/method_call_spec.rb
63
- - spec/proxy_spec.rb
64
65
  - spec/verification_spec.rb