muack 0.7.3 → 1.0.0
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.
- checksums.yaml +4 -4
- data/.gitignore +0 -1
- data/.travis.yml +3 -5
- data/CHANGES.md +68 -0
- data/Gemfile +4 -0
- data/README.md +734 -287
- data/lib/muack/block.rb +17 -0
- data/lib/muack/definition.rb +3 -2
- data/lib/muack/mock.rb +61 -31
- data/lib/muack/modifier.rb +28 -16
- data/lib/muack/satisfy.rb +5 -5
- data/lib/muack/session.rb +1 -1
- data/lib/muack/test.rb +4 -0
- data/lib/muack/version.rb +1 -1
- data/muack.gemspec +13 -10
- data/task/README.md +54 -0
- data/task/gemgem.rb +9 -11
- data/test/test_any_instance_of.rb +32 -8
- data/test/test_from_readme.rb +40 -0
- data/test/test_mock.rb +37 -26
- data/test/test_modifier.rb +102 -0
- data/test/test_proxy.rb +18 -13
- data/test/test_satisfy.rb +7 -2
- data/test/test_stub.rb +11 -6
- metadata +18 -15
- data/task/.gitignore +0 -1
- data/test/test_readme.rb +0 -16
@@ -2,10 +2,10 @@
|
|
2
2
|
require 'muack/test'
|
3
3
|
|
4
4
|
describe Muack::AnyInstanceOf do
|
5
|
-
klass = Class.new{ def f; 0; end }
|
5
|
+
klass = Class.new{ def f; 0; end; private; def g; 1; end }
|
6
6
|
|
7
7
|
should 'mock any_instance_of' do
|
8
|
-
any_instance_of(klass){ |
|
8
|
+
any_instance_of(klass){ |inst| mock(inst).say{ true } }
|
9
9
|
obj = klass.new
|
10
10
|
obj.say .should.eq true
|
11
11
|
obj.respond_to?(:say).should.eq true
|
@@ -13,16 +13,33 @@ describe Muack::AnyInstanceOf do
|
|
13
13
|
obj.respond_to?(:say).should.eq false
|
14
14
|
end
|
15
15
|
|
16
|
+
should 'mock any_instance_of with instance_exec' do
|
17
|
+
any_instance_of(klass){ |inst|
|
18
|
+
mock(inst).say.returns(:instance_exec => true){ f } }
|
19
|
+
obj = klass.new
|
20
|
+
obj.say .should.eq obj.f
|
21
|
+
Muack.verify .should.eq true
|
22
|
+
obj.respond_to?(:say).should.eq false
|
23
|
+
end
|
24
|
+
|
16
25
|
should 'proxy any_instance_of' do
|
17
|
-
any_instance_of(klass){ |
|
26
|
+
any_instance_of(klass){ |inst| mock(inst).f }
|
18
27
|
obj = klass.new
|
19
28
|
obj.f .should.eq 0
|
20
29
|
Muack.verify.should.eq true
|
21
30
|
obj.f .should.eq 0
|
22
31
|
end
|
23
32
|
|
24
|
-
should 'proxy any_instance_of
|
25
|
-
any_instance_of(klass){ |
|
33
|
+
should 'proxy any_instance_of for private methods' do
|
34
|
+
any_instance_of(klass){ |inst| mock(inst).g.peek_return{|i|i+1} }
|
35
|
+
obj = klass.new
|
36
|
+
obj.__send__(:g).should.eq 2
|
37
|
+
Muack.verify .should.eq true
|
38
|
+
obj.__send__(:g).should.eq 1
|
39
|
+
end
|
40
|
+
|
41
|
+
should 'proxy any_instance_of with peek_return' do
|
42
|
+
any_instance_of(klass){ |inst| mock(inst).f.peek_return{|i|i+1} }
|
26
43
|
obj = klass.new
|
27
44
|
obj.f .should.eq 1
|
28
45
|
Muack.verify.should.eq true
|
@@ -30,8 +47,8 @@ describe Muack::AnyInstanceOf do
|
|
30
47
|
end
|
31
48
|
|
32
49
|
should 'proxy with multiple any_instance_of call' do
|
33
|
-
any_instance_of(klass){ |
|
34
|
-
any_instance_of(klass){ |
|
50
|
+
any_instance_of(klass){ |inst| mock(inst).f.peek_return{ |i| i+1 } }
|
51
|
+
any_instance_of(klass){ |inst| mock(inst).f.peek_return{ |i| i+2 } }
|
35
52
|
obj = klass.new
|
36
53
|
obj.f.should.eq 1
|
37
54
|
obj.f.should.eq 2
|
@@ -49,8 +66,15 @@ describe Muack::AnyInstanceOf do
|
|
49
66
|
obj.f.should.eq 0
|
50
67
|
end
|
51
68
|
|
69
|
+
should 'share the same counts for different instances' do
|
70
|
+
times = 2
|
71
|
+
any_instance_of(klass){ |inst| mock(inst).f{0}.times(times) }
|
72
|
+
times.times{ klass.new.f.should.eq 0 }
|
73
|
+
Muack.verify.should.eq true
|
74
|
+
end
|
75
|
+
|
52
76
|
should 'stub proxy with any_instance_of and spy' do
|
53
|
-
any_instance_of(klass){ |inst| stub(inst).f{ |i| i+3 }
|
77
|
+
any_instance_of(klass){ |inst| stub(inst).f.peek_return{ |i| i+3 } }
|
54
78
|
obj = klass.new
|
55
79
|
obj.f.should.eq 3
|
56
80
|
obj.f.should.eq 3
|
@@ -0,0 +1,40 @@
|
|
1
|
+
|
2
|
+
require 'muack/test'
|
3
|
+
|
4
|
+
describe 'from README.md' do
|
5
|
+
readme = File.read(
|
6
|
+
"#{File.dirname(File.expand_path(__FILE__))}/../README.md")
|
7
|
+
codes = readme.scan(/``` ruby(.+?)```/m).map(&:first)
|
8
|
+
|
9
|
+
after{ Muack.reset }
|
10
|
+
|
11
|
+
Context = Module.new{
|
12
|
+
def p res
|
13
|
+
(@results ||= []) << res
|
14
|
+
end
|
15
|
+
|
16
|
+
def verify expects
|
17
|
+
return unless @results
|
18
|
+
@results.zip(expects).each do |(res, exp)|
|
19
|
+
next if exp == 'ok'
|
20
|
+
if exp.start_with?('raise')
|
21
|
+
res.should.kind_of eval(exp.sub('raise', ''))
|
22
|
+
else
|
23
|
+
res.should.eq eval(exp)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
}
|
28
|
+
|
29
|
+
codes.each.with_index do |code, index|
|
30
|
+
should 'pass from README.md #%02d' % index do
|
31
|
+
context = Module.new{extend Context}
|
32
|
+
begin
|
33
|
+
context.instance_eval(code, 'README.md', 0)
|
34
|
+
rescue Muack::Failure => e
|
35
|
+
context.p e
|
36
|
+
end
|
37
|
+
context.verify(code.scan(/# (.+)/).map(&:first))
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
data/test/test_mock.rb
CHANGED
@@ -22,6 +22,21 @@ describe Muack::Mock do
|
|
22
22
|
Obj.to_s.should.eq 'zoo'
|
23
23
|
end
|
24
24
|
|
25
|
+
should 'pass the actual block' do
|
26
|
+
mock(Obj).say{ |&block| block.call('Hi') }
|
27
|
+
Obj.say{ |msg| msg }.should.eq 'Hi'
|
28
|
+
end
|
29
|
+
|
30
|
+
should 'mock private method and preserve privacy' do
|
31
|
+
mock(Obj).private{ 'sai' }
|
32
|
+
Obj.respond_to?(:private ).should.eq false
|
33
|
+
Obj.respond_to?(:private, true).should.eq true
|
34
|
+
Obj.__send__(:private).should.eq 'sai'
|
35
|
+
Muack.verify.should.eq true
|
36
|
+
Obj.respond_to?(:private ).should.eq false
|
37
|
+
Obj.__send__(:private).should.eq 'pri'
|
38
|
+
end
|
39
|
+
|
25
40
|
should 'mock twice' do
|
26
41
|
mock(Obj).say(true){ Obj.saya }
|
27
42
|
mock(Obj).saya{ 'coo' }
|
@@ -37,25 +52,31 @@ describe Muack::Mock do
|
|
37
52
|
Muack.reset
|
38
53
|
end
|
39
54
|
|
40
|
-
should 'mock
|
41
|
-
|
42
|
-
|
55
|
+
should 'mix mock and stub' do
|
56
|
+
mock(Obj).say { 0 }
|
57
|
+
stub(Obj).saya{ 1 }
|
58
|
+
3.times{ Obj.saya.should.eq 1 }
|
59
|
+
Obj.say .should.eq 0
|
43
60
|
end
|
44
61
|
|
45
|
-
should 'mock
|
46
|
-
|
47
|
-
|
62
|
+
should 'mix mock and stub with conflicting method, latter wins' do
|
63
|
+
stub(Obj).say{0}
|
64
|
+
mock(Obj).say{1}
|
65
|
+
Obj.say.should.eq 1
|
48
66
|
end
|
49
67
|
|
50
|
-
should 'mock
|
51
|
-
|
68
|
+
should 'mix mock and stub with conflicting method, try to hit stub' do
|
69
|
+
stub(Obj).say{0}
|
70
|
+
mock(Obj).say{1}
|
71
|
+
Obj.say.should.eq 1
|
72
|
+
lambda{ Obj.say }.should.raise(Muack::Expected)
|
52
73
|
end
|
53
74
|
|
54
|
-
should 'mix mock and stub' do
|
55
|
-
mock(Obj).say
|
56
|
-
stub(Obj).
|
57
|
-
|
58
|
-
|
75
|
+
should 'mix mock and stub with conflicting method, mock never called' do
|
76
|
+
mock(Obj).say{0}
|
77
|
+
stub(Obj).say{1}
|
78
|
+
Obj.say.should.eq 1
|
79
|
+
lambda{ Muack.verify }.should.raise(Muack::Expected)
|
59
80
|
end
|
60
81
|
|
61
82
|
should 'unnamed mock' do
|
@@ -76,16 +97,6 @@ describe Muack::Mock do
|
|
76
97
|
Muack.verify.should.eq true
|
77
98
|
obj.f .should.eq 0
|
78
99
|
end
|
79
|
-
|
80
|
-
should 'return values with returns with a value' do
|
81
|
-
mock(Obj).say.returns(0)
|
82
|
-
Obj.say.should.eq 0
|
83
|
-
end
|
84
|
-
|
85
|
-
should 'return values with returns with a block' do
|
86
|
-
mock(Obj).say.returns{0}
|
87
|
-
Obj.say.should.eq 0
|
88
|
-
end
|
89
100
|
end
|
90
101
|
|
91
102
|
describe 'Muack.verify==false' do
|
@@ -107,7 +118,7 @@ describe Muack::Mock do
|
|
107
118
|
end
|
108
119
|
|
109
120
|
should 'have correct message for multiple mocks with the same name' do
|
110
|
-
2.times{ mock(Obj).say }
|
121
|
+
2.times{ mock(Obj).say{} }
|
111
122
|
begin
|
112
123
|
3.times{ Obj.say }
|
113
124
|
'never'.should.eq 'reach'
|
@@ -121,7 +132,7 @@ describe Muack::Mock do
|
|
121
132
|
end
|
122
133
|
|
123
134
|
should 'have correct message for mocks with special satisfier' do
|
124
|
-
mock(Obj).say(anything)
|
135
|
+
mock(Obj).say(anything){}
|
125
136
|
begin
|
126
137
|
Obj.say(1)
|
127
138
|
Obj.say(2)
|
@@ -188,7 +199,7 @@ describe Muack::Mock do
|
|
188
199
|
|
189
200
|
should 'show first not enough calls' do
|
190
201
|
mock(Obj).say{ 'boo' }.times(2)
|
191
|
-
mock(Obj).saya
|
202
|
+
mock(Obj).saya{} .times(2)
|
192
203
|
begin
|
193
204
|
Obj.say
|
194
205
|
Muack.verify
|
@@ -0,0 +1,102 @@
|
|
1
|
+
|
2
|
+
require 'muack/test'
|
3
|
+
|
4
|
+
describe Muack::Modifier do
|
5
|
+
after do
|
6
|
+
Muack.verify.should.eq true
|
7
|
+
Muack::EnsureReset.call
|
8
|
+
end
|
9
|
+
|
10
|
+
describe 'times' do
|
11
|
+
should 'mock multiple times' do
|
12
|
+
3.times{ |i| mock(Obj).say(i){ i } }
|
13
|
+
3.times{ |i| Obj.say(i).should.eq i }
|
14
|
+
end
|
15
|
+
|
16
|
+
should 'mock multiple times with times(n) modifier' do
|
17
|
+
mock(Obj).say{ 0 }.times(3)
|
18
|
+
3.times{ |i| Obj.say.should.eq 0 }
|
19
|
+
end
|
20
|
+
|
21
|
+
should 'mock 0 times with times(0) modifier' do
|
22
|
+
mock(Obj).say{ 0 }.times(0).should.kind_of Muack::Modifier
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
describe 'returns' do
|
27
|
+
should 'return with lexical scope' do
|
28
|
+
mock(Obj).say.returns{0}
|
29
|
+
Obj.say.should.eq 0
|
30
|
+
end
|
31
|
+
|
32
|
+
should 'return with dynamic scope' do
|
33
|
+
mock(Obj).say.returns(:instance_exec => true){object_id}
|
34
|
+
Obj.say.should.eq Obj.object_id
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe 'peek_args' do
|
39
|
+
should 'with lexical scope' do
|
40
|
+
str = 'ff'
|
41
|
+
stub(str).to_i.peek_args{16}
|
42
|
+
str.to_i.should.eq 255
|
43
|
+
end
|
44
|
+
|
45
|
+
should 'with dynamic scope' do
|
46
|
+
str = '16'
|
47
|
+
stub(str).to_i.peek_args(:instance_exec => true){Integer(self)}
|
48
|
+
str.to_i.should.eq 22
|
49
|
+
end
|
50
|
+
|
51
|
+
should 'modify' do
|
52
|
+
str = 'ff'
|
53
|
+
stub(str).to_i(is_a(Integer)).peek_args{ |radix| radix * 2 }
|
54
|
+
str.to_i(8).should.eq 255
|
55
|
+
end
|
56
|
+
|
57
|
+
should 'preserve args' do
|
58
|
+
stub(Obj).say{|*a|a}.with_any_args.peek_args{|*a|a}
|
59
|
+
Obj.say(0,1).should.eq [0,1]
|
60
|
+
end
|
61
|
+
|
62
|
+
should 'pass first args' do
|
63
|
+
stub(Obj).say{|*a|a}.with_any_args.peek_args{|a|a}
|
64
|
+
Obj.say(0,1).should.eq [0]
|
65
|
+
end
|
66
|
+
|
67
|
+
should 'pass nothing with nil' do
|
68
|
+
stub(Obj).say{|*a|a}.with_any_args.peek_args{}
|
69
|
+
Obj.say(0,1).should.eq []
|
70
|
+
end
|
71
|
+
|
72
|
+
should 'pass nothing with empty array' do
|
73
|
+
stub(Obj).say{|*a|a}.with_any_args.peek_args{[]}
|
74
|
+
Obj.say(0,1).should.eq []
|
75
|
+
end
|
76
|
+
|
77
|
+
should 'pass an empty array with [[]]' do
|
78
|
+
stub(Obj).say{|*a|a}.with_any_args.peek_args{[[]]}
|
79
|
+
Obj.say(0,1).should.eq [[]]
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
describe 'peek_return' do
|
84
|
+
should 'with lexical scope' do
|
85
|
+
str = 'ff'
|
86
|
+
stub(str).to_i.peek_return{16}
|
87
|
+
str.to_i.should.eq 16
|
88
|
+
end
|
89
|
+
|
90
|
+
should 'with dynamic scope' do
|
91
|
+
str = '16'
|
92
|
+
stub(str).to_i.peek_return(:instance_exec => true){Integer(self)+1}
|
93
|
+
str.to_i.should.eq 17
|
94
|
+
end
|
95
|
+
|
96
|
+
should 'modify' do
|
97
|
+
str = 'ff'
|
98
|
+
stub(str).to_i(is_a(Integer)).peek_return{ |result| result * 2 }
|
99
|
+
str.to_i(16).should.eq 510
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
data/test/test_proxy.rb
CHANGED
@@ -9,57 +9,62 @@ describe Muack::Mock do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
should 'proxy with regular method' do
|
12
|
-
mock(Str).reverse
|
12
|
+
mock(Str).reverse
|
13
13
|
Str.reverse.should.eq 'ooM'
|
14
14
|
end
|
15
15
|
|
16
|
+
should 'proxy with private method' do
|
17
|
+
mock(Obj).private.peek_return(&:reverse)
|
18
|
+
Obj.__send__(:private).should.eq 'irp'
|
19
|
+
end
|
20
|
+
|
16
21
|
should 'proxy multiple times' do
|
17
|
-
2.times{ mock(Str).reverse
|
22
|
+
2.times{ mock(Str).reverse }
|
18
23
|
2.times{ Str.reverse.should.eq 'ooM' }
|
19
24
|
end
|
20
25
|
|
21
26
|
should 'proxy multiple times with super method' do
|
22
|
-
2.times{ mock(Str).class
|
27
|
+
2.times{ mock(Str).class }
|
23
28
|
2.times{ Str.class.should.eq String }
|
24
29
|
end
|
25
30
|
|
26
31
|
should 'return modifier itself for any modifier methods' do
|
27
|
-
mock(Str).to_s.
|
32
|
+
mock(Str).to_s.peek_return{ |s| s.reverse }.times(2).
|
28
33
|
with_any_args.with_any_args
|
29
34
|
2.times{ Str.to_s.should.eq 'ooM' }
|
30
35
|
end
|
31
36
|
|
32
37
|
should 'proxy and call the block' do
|
33
|
-
mock(Obj).method_missing(:inspect){ |str| str.reverse }
|
38
|
+
mock(Obj).method_missing(:inspect).peek_return{ |str| str.reverse }
|
34
39
|
Obj.inspect.should.eq 'jbo'
|
35
40
|
end
|
36
41
|
|
37
42
|
should 'proxy and call the block with super' do
|
38
|
-
mock(Str).class{ |k| k.name.reverse }
|
43
|
+
mock(Str).class.peek_return{ |k| k.name.reverse }
|
39
44
|
Str.class.should.eq 'gnirtS'
|
40
45
|
end
|
41
46
|
|
42
47
|
should 'mock proxy and call, mock proxy and call' do
|
43
|
-
mock(Obj).class{ |k| k.name.reverse }
|
48
|
+
mock(Obj).class.peek_return{ |k| k.name.reverse }
|
44
49
|
Obj.class.should.eq 'tcejbO'
|
45
|
-
mock(Obj).class{ |k| k.name.upcase }
|
50
|
+
mock(Obj).class.peek_return{ |k| k.name.upcase }
|
46
51
|
Obj.class.should.eq 'OBJECT'
|
47
52
|
end
|
48
53
|
|
49
54
|
should 'stub proxy and call, stub proxy and call' do
|
50
|
-
stub(Obj).kind_of?(Object){ |b| !b }
|
55
|
+
stub(Obj).kind_of?(Object).peek_return{ |b| !b }
|
51
56
|
Obj.kind_of?(Object).should.eq false
|
52
|
-
stub(Obj).kind_of?(String){ |b| b.to_s }
|
57
|
+
stub(Obj).kind_of?(String).peek_return{ |b| b.to_s }
|
53
58
|
Obj.kind_of?(String).should.eq 'false'
|
54
59
|
end
|
55
60
|
|
56
61
|
should 'stub proxy with any times' do
|
57
|
-
stub(Obj).class{ |k| k.name.downcase }
|
62
|
+
stub(Obj).class.peek_return{ |k| k.name.downcase }
|
58
63
|
3.times{ Obj.class.should.eq 'object' }
|
59
64
|
end
|
60
65
|
|
61
66
|
should 'stub proxy and spy' do
|
62
|
-
stub(Obj).class{ |k| k.name.downcase }
|
67
|
+
stub(Obj).class.peek_return{ |k| k.name.downcase }
|
63
68
|
Obj.class.should.eq 'object'
|
64
69
|
spy(Obj).class
|
65
70
|
end
|
@@ -72,7 +77,7 @@ describe Muack::Mock do
|
|
72
77
|
end
|
73
78
|
|
74
79
|
should 'raise Expected error if passing unexpected argument' do
|
75
|
-
mock(Str).reverse
|
80
|
+
mock(Str).reverse
|
76
81
|
Str.reverse.should.eq 'ooM'
|
77
82
|
begin
|
78
83
|
Str.reverse
|
data/test/test_satisfy.rb
CHANGED
@@ -247,6 +247,11 @@ describe Muack::Satisfy do
|
|
247
247
|
matcher.inspect.should.start_with expected
|
248
248
|
end
|
249
249
|
|
250
|
+
should 'not crash for top-level subclass' do
|
251
|
+
Class.new(Muack::Satisfy){ def self.name; 'TopLevel'; end }.new.
|
252
|
+
api_name.should.eq 'top_level'
|
253
|
+
end
|
254
|
+
|
250
255
|
should 'satisfy' do
|
251
256
|
mock(Str).say(satisfy{ |arg| arg % 2 == 0 }){ |arg| arg + 1 }
|
252
257
|
Str.say(14).should.eq 15
|
@@ -270,7 +275,7 @@ describe Muack::Satisfy do
|
|
270
275
|
end
|
271
276
|
end
|
272
277
|
|
273
|
-
describe Muack::Satisfy::
|
278
|
+
describe Muack::Satisfy::Disj do
|
274
279
|
should 'have human readable to_s and inspect' do
|
275
280
|
matcher = is_a(TrueClass) | is_a(FalseClass)
|
276
281
|
expected = 'Muack::API.is_a(TrueClass) | Muack::API.is_a(FalseClass)'
|
@@ -303,7 +308,7 @@ describe Muack::Satisfy do
|
|
303
308
|
end
|
304
309
|
end
|
305
310
|
|
306
|
-
describe Muack::Satisfy::
|
311
|
+
describe Muack::Satisfy::Conj do
|
307
312
|
should 'have human readable to_s and inspect' do
|
308
313
|
matcher = respond_to(:ancestors) & is_a(Class)
|
309
314
|
expected = 'Muack::API.respond_to(:ancestors) & Muack::API.is_a(Class)'
|
data/test/test_stub.rb
CHANGED
@@ -33,6 +33,11 @@ describe Muack::Stub do
|
|
33
33
|
Str.say(' ').should.eq 'Hoo'
|
34
34
|
end
|
35
35
|
|
36
|
+
should 'pass the actual block' do
|
37
|
+
stub(Obj).say{ |&block| block.call('Hi') }
|
38
|
+
Obj.say{ |msg| msg }.should.eq 'Hi'
|
39
|
+
end
|
40
|
+
|
36
41
|
should 'accept block form' do
|
37
42
|
stub(Obj){ |o| o.say{0}; o.saya{1} }
|
38
43
|
Obj.saya.should.eq 1
|
@@ -46,13 +51,13 @@ describe Muack::Stub do
|
|
46
51
|
end
|
47
52
|
|
48
53
|
should 'work with spy twice' do
|
49
|
-
stub(Obj).say
|
54
|
+
stub(Obj).say{}
|
50
55
|
2.times{ Obj.say.should.eq nil }
|
51
56
|
spy(Obj).say.times(2)
|
52
57
|
end
|
53
58
|
|
54
59
|
should 'work with spy spy' do
|
55
|
-
stub(Obj).say
|
60
|
+
stub(Obj).say{}
|
56
61
|
2.times{ Obj.say.should.eq nil }
|
57
62
|
2.times{ spy(Obj).say }
|
58
63
|
end
|
@@ -90,7 +95,7 @@ describe Muack::Stub do
|
|
90
95
|
end
|
91
96
|
|
92
97
|
should 'raise Expected if the spy is not satisfied' do
|
93
|
-
stub(Obj).say
|
98
|
+
stub(Obj).say{}
|
94
99
|
spy( Obj).say
|
95
100
|
begin
|
96
101
|
Muack.verify
|
@@ -105,7 +110,7 @@ describe Muack::Stub do
|
|
105
110
|
end
|
106
111
|
|
107
112
|
should 'raise Expected if the spy is not satisfied enough' do
|
108
|
-
stub(Obj).say
|
113
|
+
stub(Obj).say{}
|
109
114
|
Obj.say
|
110
115
|
spy( Obj).say(0)
|
111
116
|
begin
|
@@ -119,7 +124,7 @@ describe Muack::Stub do
|
|
119
124
|
end
|
120
125
|
|
121
126
|
should 'show correct times for under satisfaction' do
|
122
|
-
stub(Obj).say
|
127
|
+
stub(Obj).say{}
|
123
128
|
2.times{ Obj.say }
|
124
129
|
spy( Obj).say.times(3)
|
125
130
|
begin
|
@@ -135,7 +140,7 @@ describe Muack::Stub do
|
|
135
140
|
end
|
136
141
|
|
137
142
|
should 'show correct times for over satisfaction' do
|
138
|
-
stub(Obj).say
|
143
|
+
stub(Obj).say{}
|
139
144
|
2.times{ Obj.say }
|
140
145
|
spy( Obj).say
|
141
146
|
begin
|