minispec 0.0.1
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 +7 -0
- data/.pryrc +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +2140 -0
- data/Rakefile +11 -0
- data/bin/minispec +4 -0
- data/lib/minispec.rb +175 -0
- data/lib/minispec/api.rb +2 -0
- data/lib/minispec/api/class.rb +195 -0
- data/lib/minispec/api/class/after.rb +49 -0
- data/lib/minispec/api/class/around.rb +54 -0
- data/lib/minispec/api/class/before.rb +101 -0
- data/lib/minispec/api/class/helpers.rb +116 -0
- data/lib/minispec/api/class/let.rb +44 -0
- data/lib/minispec/api/class/tests.rb +33 -0
- data/lib/minispec/api/instance.rb +158 -0
- data/lib/minispec/api/instance/mocks/doubles.rb +36 -0
- data/lib/minispec/api/instance/mocks/mocks.rb +319 -0
- data/lib/minispec/api/instance/mocks/spies.rb +17 -0
- data/lib/minispec/api/instance/mocks/stubs.rb +105 -0
- data/lib/minispec/helpers.rb +1 -0
- data/lib/minispec/helpers/array.rb +56 -0
- data/lib/minispec/helpers/booleans.rb +108 -0
- data/lib/minispec/helpers/generic.rb +24 -0
- data/lib/minispec/helpers/mocks/expectations.rb +29 -0
- data/lib/minispec/helpers/mocks/spies.rb +36 -0
- data/lib/minispec/helpers/raise.rb +44 -0
- data/lib/minispec/helpers/throw.rb +29 -0
- data/lib/minispec/mocks.rb +11 -0
- data/lib/minispec/mocks/expectations.rb +77 -0
- data/lib/minispec/mocks/stubs.rb +178 -0
- data/lib/minispec/mocks/validations.rb +80 -0
- data/lib/minispec/mocks/validations/amount.rb +63 -0
- data/lib/minispec/mocks/validations/arguments.rb +161 -0
- data/lib/minispec/mocks/validations/caller.rb +43 -0
- data/lib/minispec/mocks/validations/order.rb +47 -0
- data/lib/minispec/mocks/validations/raise.rb +111 -0
- data/lib/minispec/mocks/validations/return.rb +74 -0
- data/lib/minispec/mocks/validations/throw.rb +91 -0
- data/lib/minispec/mocks/validations/yield.rb +141 -0
- data/lib/minispec/proxy.rb +201 -0
- data/lib/minispec/reporter.rb +185 -0
- data/lib/minispec/utils.rb +139 -0
- data/lib/minispec/utils/differ.rb +325 -0
- data/lib/minispec/utils/pretty_print.rb +51 -0
- data/lib/minispec/utils/raise.rb +123 -0
- data/lib/minispec/utils/throw.rb +140 -0
- data/minispec.gemspec +27 -0
- data/test/mocks/expectations/amount.rb +67 -0
- data/test/mocks/expectations/arguments.rb +126 -0
- data/test/mocks/expectations/caller.rb +55 -0
- data/test/mocks/expectations/generic.rb +35 -0
- data/test/mocks/expectations/order.rb +46 -0
- data/test/mocks/expectations/raise.rb +166 -0
- data/test/mocks/expectations/return.rb +71 -0
- data/test/mocks/expectations/throw.rb +113 -0
- data/test/mocks/expectations/yield.rb +109 -0
- data/test/mocks/spies/amount.rb +68 -0
- data/test/mocks/spies/arguments.rb +57 -0
- data/test/mocks/spies/generic.rb +61 -0
- data/test/mocks/spies/order.rb +38 -0
- data/test/mocks/spies/raise.rb +158 -0
- data/test/mocks/spies/return.rb +71 -0
- data/test/mocks/spies/throw.rb +113 -0
- data/test/mocks/spies/yield.rb +101 -0
- data/test/mocks/test__doubles.rb +98 -0
- data/test/mocks/test__expectations.rb +27 -0
- data/test/mocks/test__mocks.rb +197 -0
- data/test/mocks/test__proxies.rb +61 -0
- data/test/mocks/test__spies.rb +43 -0
- data/test/mocks/test__stubs.rb +427 -0
- data/test/proxified_asserts.rb +34 -0
- data/test/setup.rb +53 -0
- data/test/test__around.rb +58 -0
- data/test/test__assert.rb +510 -0
- data/test/test__before_and_after.rb +117 -0
- data/test/test__before_and_after_all.rb +71 -0
- data/test/test__helpers.rb +197 -0
- data/test/test__raise.rb +104 -0
- data/test/test__skip.rb +41 -0
- data/test/test__throw.rb +103 -0
- metadata +196 -0
@@ -0,0 +1,71 @@
|
|
1
|
+
class MinispecTest::Spies::Unit
|
2
|
+
|
3
|
+
should 'pass when correct value returned' do
|
4
|
+
o.a
|
5
|
+
expect(o).received(:a).and_returned(:a)
|
6
|
+
end
|
7
|
+
|
8
|
+
should ':fail when wrong value returned' do
|
9
|
+
o.a
|
10
|
+
expect(o).received(:a).and_returned(:b)
|
11
|
+
end
|
12
|
+
|
13
|
+
should 'pass when proc validates returned value' do
|
14
|
+
o.a
|
15
|
+
expect(o).received(:a).and_returned {|r| r == [:a]}
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'yield multiple returned values when message received multiple times' do
|
19
|
+
o.a
|
20
|
+
o.a
|
21
|
+
expect(o).received(:a).and_returned {|r| r == [:a, :a]}
|
22
|
+
end
|
23
|
+
|
24
|
+
should ':fail when proc does not validate returned value' do
|
25
|
+
o.a
|
26
|
+
expect(o).received(:a).and_returned {|r| false}
|
27
|
+
end
|
28
|
+
|
29
|
+
should 'pass when returned values matches expected ones' do
|
30
|
+
o.a
|
31
|
+
o.b
|
32
|
+
expect(o).received(:a, :b).and_returned(:a, :b)
|
33
|
+
end
|
34
|
+
|
35
|
+
should 'pass when all messages returns same value' do
|
36
|
+
o.a
|
37
|
+
o.z
|
38
|
+
expect(o).received(:a, :z).and_returned(:a)
|
39
|
+
end
|
40
|
+
|
41
|
+
should ':fail when a single value expected and a at least one message does not return it' do
|
42
|
+
o.a
|
43
|
+
o.b
|
44
|
+
expect(o).received(:a, :b).and_returned(:a)
|
45
|
+
end
|
46
|
+
|
47
|
+
should ':fail when at least one message does not return what expected' do
|
48
|
+
o.a
|
49
|
+
o.b
|
50
|
+
expect(o).received(:a, :b).and_returned(:a, :x)
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'pass when proc validates returned values' do
|
54
|
+
o.a
|
55
|
+
o.b
|
56
|
+
expect(o).received(:a, :b).and_returned {|a,b| a == [:a] && b == [:b]}
|
57
|
+
end
|
58
|
+
|
59
|
+
should 'yield multiple returned values when multiple messages received multiple times' do
|
60
|
+
o.a
|
61
|
+
o.a
|
62
|
+
o.b
|
63
|
+
expect(o).received(:a, :b).and_returned {|a,b| a == [:a, :a] && b == [:b]}
|
64
|
+
end
|
65
|
+
|
66
|
+
should ':fail when proc does not validate returned values' do
|
67
|
+
o.a
|
68
|
+
o.b
|
69
|
+
expect(o).received(:a, :b).and_returned {|a| false}
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,113 @@
|
|
1
|
+
class MinispecTest::Spies::Unit
|
2
|
+
|
3
|
+
should 'pass when throw expected and occurred' do
|
4
|
+
o.t rescue nil
|
5
|
+
expect(o).received(:t).and_throw :s
|
6
|
+
end
|
7
|
+
|
8
|
+
should ':fail when throw expected but not occurred' do
|
9
|
+
o.a
|
10
|
+
expect(o).received(:a).and_throw :s
|
11
|
+
end
|
12
|
+
|
13
|
+
should ':fail when throw occurred but not expected' do
|
14
|
+
o.t rescue nil
|
15
|
+
expect(o).received(:t).without_throw
|
16
|
+
end
|
17
|
+
|
18
|
+
should 'pass when throw not expected and not occurred' do
|
19
|
+
o.a
|
20
|
+
expect(o).received(:a).without_throw
|
21
|
+
end
|
22
|
+
|
23
|
+
should 'pass when an expected symbol thrown' do
|
24
|
+
o.t rescue nil
|
25
|
+
expect(o).received(:t).and_throw :s
|
26
|
+
end
|
27
|
+
|
28
|
+
should ':fail when thrown an unexpected symbol' do
|
29
|
+
o.t rescue nil
|
30
|
+
expect(o).received(:t).and_throw :x
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'pass when given block validates thrown symbol' do
|
34
|
+
o.t rescue nil
|
35
|
+
expect(o).received(:t).and_throw {|t| t == [:s]}
|
36
|
+
end
|
37
|
+
|
38
|
+
should ':fail when given block does not validate thrown symbol' do
|
39
|
+
o.t rescue nil
|
40
|
+
expect(o).received(:t).and_throw {false}
|
41
|
+
end
|
42
|
+
|
43
|
+
should 'pass when given block validates thrown symbols' do
|
44
|
+
o.t rescue nil
|
45
|
+
o.w rescue nil
|
46
|
+
expect(o).received(:t, :w).and_throw {|t,w| t == [:s] && w == [:s]}
|
47
|
+
end
|
48
|
+
|
49
|
+
should ':fail when given block does not validate thrown symbols' do
|
50
|
+
o.t rescue nil
|
51
|
+
o.w rescue nil
|
52
|
+
expect(o).received(:t, :w).and_throw {false}
|
53
|
+
end
|
54
|
+
|
55
|
+
should 'pass when all messages uses same expectation' do
|
56
|
+
o.t rescue nil
|
57
|
+
o.w rescue nil
|
58
|
+
expect(o).received(:t, :w).and_throw :s
|
59
|
+
end
|
60
|
+
|
61
|
+
should ':fail when all messages uses same expectation
|
62
|
+
and at least one message throws a wrong symbol' do
|
63
|
+
o.t rescue nil
|
64
|
+
o.w rescue nil
|
65
|
+
expect(o).received(:t, :w).and_throw :x
|
66
|
+
end
|
67
|
+
|
68
|
+
should ':fail when all messages uses same expectation
|
69
|
+
ad at least one message does not throw any symbol' do
|
70
|
+
o.t rescue nil
|
71
|
+
o.z
|
72
|
+
expect(o).received(:t, :z).and_throw :t
|
73
|
+
end
|
74
|
+
|
75
|
+
should 'pass when each message uses own expectation' do
|
76
|
+
o.t rescue nil
|
77
|
+
o.w rescue nil
|
78
|
+
expect(o).received(:t, :w).and_throw :s, :s
|
79
|
+
end
|
80
|
+
|
81
|
+
should ':fail when each message uses own expectation
|
82
|
+
and at least one message does not throw as expected' do
|
83
|
+
o.t rescue nil
|
84
|
+
o.w rescue nil
|
85
|
+
expect(o).received(:t, :w).and_throw :s, :x
|
86
|
+
end
|
87
|
+
|
88
|
+
should ':fail when each message uses own expectation
|
89
|
+
and at least one message does not throw at all' do
|
90
|
+
o.t rescue nil
|
91
|
+
o.z
|
92
|
+
expect(o).received(:t, :z).and_throw :t, :z
|
93
|
+
end
|
94
|
+
|
95
|
+
should ':fail when at least one throw occurred but none expected' do
|
96
|
+
o.a
|
97
|
+
o.t rescue nil
|
98
|
+
expect(o).received(:a, :t).without_throw
|
99
|
+
end
|
100
|
+
|
101
|
+
should ':fail when multiple thrown expected but none occurred' do
|
102
|
+
o.a
|
103
|
+
o.b
|
104
|
+
expect(o).received(:a, :b).and_throw :s, :s
|
105
|
+
end
|
106
|
+
|
107
|
+
should 'pass when no thrown expected and none expected' do
|
108
|
+
o.a
|
109
|
+
o.b
|
110
|
+
expect(o).received(:a, :b).without_throw
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
@@ -0,0 +1,101 @@
|
|
1
|
+
class MinispecTest::Spies::Unit
|
2
|
+
|
3
|
+
should 'pass when yield expected and occurred' do
|
4
|
+
o.y {|a,b|}
|
5
|
+
expect(o).received(:y).and_yield
|
6
|
+
end
|
7
|
+
|
8
|
+
should 'pass when yield not expected and not occurred' do
|
9
|
+
o = Class.new { def y; end }.new
|
10
|
+
proxy(o, :y)
|
11
|
+
o.y
|
12
|
+
expect(o).received(:y).without_yield
|
13
|
+
end
|
14
|
+
|
15
|
+
should ':fail when yield expected but not occurred' do
|
16
|
+
o.a
|
17
|
+
expect(o).received(:a).and_yield
|
18
|
+
end
|
19
|
+
|
20
|
+
should ':fail when yield occurred but not expected' do
|
21
|
+
o.y {|a,b|}
|
22
|
+
expect(o).received(:y).without_yield
|
23
|
+
end
|
24
|
+
|
25
|
+
should 'pass when yielded with expected arguments' do
|
26
|
+
o.y {|a, b|}
|
27
|
+
expect(o).received(:y).and_yield(1, 2)
|
28
|
+
end
|
29
|
+
|
30
|
+
should ':fail when yielded with wrong arguments' do
|
31
|
+
o.y {|a, b|}
|
32
|
+
expect(o).received(:y).and_yield(4, 5)
|
33
|
+
end
|
34
|
+
|
35
|
+
should 'pass when proc validates yielded arguments' do
|
36
|
+
o.y {|a, b|}
|
37
|
+
expect(o).received(:y).and_yield {|args| args == [[1, 2]]}
|
38
|
+
end
|
39
|
+
|
40
|
+
should ':fail when proc does not validate yielded arguments' do
|
41
|
+
o.y {|a, b|}
|
42
|
+
expect(o).received(:y).and_yield {|a,b| false}
|
43
|
+
end
|
44
|
+
|
45
|
+
should 'not raise when arity not respected and proc used' do
|
46
|
+
refute { o.y {|a|} }.raise
|
47
|
+
expect(o).received(:y)
|
48
|
+
end
|
49
|
+
|
50
|
+
should 'use same expectation for all messages' do
|
51
|
+
o.y {|a,b|}
|
52
|
+
o.x {|a,b|}
|
53
|
+
expect(o).received(:y, :x).and_yield([1, 2])
|
54
|
+
end
|
55
|
+
|
56
|
+
should 'pass when multiple yielded arguments match expected ones' do
|
57
|
+
o.y {|a,b|}
|
58
|
+
o.x {|a,b|}
|
59
|
+
expect(o).received(:y, :x).and_yield([1, 2], [1, 2])
|
60
|
+
end
|
61
|
+
|
62
|
+
should 'work well when multiple Array arguments yielded' do
|
63
|
+
o.define_singleton_method(:Y) {|&b| b.call([1, [2]])}
|
64
|
+
proxy(o, :Y)
|
65
|
+
o.Y {|a,b|}
|
66
|
+
o.x {|a,b|}
|
67
|
+
expect(o).received(:Y, :x).and_yield([[[1, [2]]]], [1, 2])
|
68
|
+
end
|
69
|
+
|
70
|
+
should 'pass when proc validates multiple yielded arguments' do
|
71
|
+
o.define_singleton_method(:Y) {|&b| b.call([1, [2]])}
|
72
|
+
proxy(o, :Y)
|
73
|
+
o.Y {|a,b|}
|
74
|
+
o.x {|a,b|}
|
75
|
+
expect(o).received(:Y, :x).and_yield {|y,x| y == [[[1, [2]]]] && x == [[1, 2]]}
|
76
|
+
end
|
77
|
+
|
78
|
+
should ':fail when multiple yielded arguments does not match expected ones' do
|
79
|
+
o.y {|a,b|}
|
80
|
+
o.x {|a,b|}
|
81
|
+
expect(o).received(:y, :x).and_yield(1, 0)
|
82
|
+
end
|
83
|
+
|
84
|
+
should ':fail when proc does not validate multiple yielded arguments' do
|
85
|
+
o.y {|a,b|}
|
86
|
+
o.x {|a,b|}
|
87
|
+
expect(o).received(:y, :x).and_yield {|*a| false}
|
88
|
+
end
|
89
|
+
|
90
|
+
should ':fail when multiple yields expected but none occurred' do
|
91
|
+
o.a
|
92
|
+
o.b
|
93
|
+
expect(o).received(:a, :b).and_yield
|
94
|
+
end
|
95
|
+
|
96
|
+
should ':fail when at least one yield occurred but none expected' do
|
97
|
+
o.a {}
|
98
|
+
o.x {|a,b|}
|
99
|
+
expect(o).received(:a, :x).without_yield
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class Stubs < self
|
3
|
+
class Unit
|
4
|
+
include Minispec
|
5
|
+
|
6
|
+
it 'uses first argument as name' do
|
7
|
+
d = double(:a, :b)
|
8
|
+
is(d.inspect) == :a
|
9
|
+
end
|
10
|
+
|
11
|
+
it 'creates anonymous doubles when no args given' do
|
12
|
+
d = double
|
13
|
+
does(d.inspect) =~ /#<Object/
|
14
|
+
end
|
15
|
+
|
16
|
+
it 'uses first argument as name and rest as stubs' do
|
17
|
+
d = double(:a, :b, :c)
|
18
|
+
is(d.inspect) == :a
|
19
|
+
refute(d).respond_to?(:a)
|
20
|
+
does(d).respond_to?(:b)
|
21
|
+
does(d).respond_to?(:c)
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'uses hashes for stubs' do
|
25
|
+
a = double(:a, b: :c)
|
26
|
+
is(a.b) == :c
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'uses given block for returned value' do
|
30
|
+
a = double(:a, :b) {:c}
|
31
|
+
is(a.b) == :c
|
32
|
+
end
|
33
|
+
|
34
|
+
it 'creates public stubs' do
|
35
|
+
d = double(:a, :b)
|
36
|
+
does(d.public_methods).include?(:b)
|
37
|
+
end
|
38
|
+
|
39
|
+
it 'creates private stubs' do
|
40
|
+
d = double
|
41
|
+
private_stub(d, :a)
|
42
|
+
does(d.private_methods).include?(:a)
|
43
|
+
does { d.a }.raise? NoMethodError, /private method\W+a/
|
44
|
+
end
|
45
|
+
|
46
|
+
it 'creates protected stubs' do
|
47
|
+
d = double
|
48
|
+
protected_stub(d, :a)
|
49
|
+
does(d.protected_methods).include?(:a)
|
50
|
+
does { d.a }.raise? NoMethodError, /protected method\W+a/
|
51
|
+
end
|
52
|
+
|
53
|
+
it 'defines chained stubs' do
|
54
|
+
@a = nil
|
55
|
+
d = double(:chained, 'a.b.c') {|*a| @a = true; a}
|
56
|
+
|
57
|
+
does(d).respond_to?(:a)
|
58
|
+
d.a
|
59
|
+
is(@a).nil?
|
60
|
+
|
61
|
+
does(d.a).respond_to?(:b)
|
62
|
+
d.a.b
|
63
|
+
is(@a).nil?
|
64
|
+
|
65
|
+
does(d.a.b).respond_to?(:c)
|
66
|
+
expect(d.a.b.c(:x, :y)).to_contain :x, :y
|
67
|
+
is(@a).true?
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'plays well with expectations' do
|
71
|
+
d = double(:dbl, :a)
|
72
|
+
expect(d).to_receive(:a)
|
73
|
+
d.a
|
74
|
+
end
|
75
|
+
|
76
|
+
class SomeError < ArgumentError; end
|
77
|
+
it 'plays well with raise expectations' do
|
78
|
+
d = double(:dbl, :a) { raise SomeError }
|
79
|
+
expect(d).to_receive(:a).and_raise SomeError
|
80
|
+
d.a rescue nil
|
81
|
+
end
|
82
|
+
|
83
|
+
it 'plays well with throw expectations' do
|
84
|
+
d = double(:dbl, :a) { throw :ArgumentError }
|
85
|
+
expect(d).to_receive(:a).and_throw :ArgumentError
|
86
|
+
d.a rescue nil
|
87
|
+
end
|
88
|
+
|
89
|
+
it 'plays well with yield expectations' do
|
90
|
+
d = double(:dbl, :a) { |&b| b.call :x }
|
91
|
+
expect(d).to_receive(:a).and_yield :x
|
92
|
+
d.a {|a|}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
define_tests(Unit)
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class Expectations < self
|
3
|
+
|
4
|
+
class O
|
5
|
+
def a(*a); :a; end
|
6
|
+
def b(*a); :b; end
|
7
|
+
def c(*a); :c; end
|
8
|
+
def d; :d; end
|
9
|
+
def e; raise(ArgumentError, 'some blah'); end
|
10
|
+
def r; raise(ArgumentError, 'some blah'); end
|
11
|
+
def t; throw(:s); end
|
12
|
+
def w; throw(:s); end
|
13
|
+
def x(&b); yield(1, 2); end
|
14
|
+
def y(&b); yield(1, 2); end
|
15
|
+
def z; :a; end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Unit
|
19
|
+
include Minispec
|
20
|
+
continue_on_failures true
|
21
|
+
let(:o) { O.new }
|
22
|
+
end
|
23
|
+
|
24
|
+
Dir[File.expand_path('../expectations/*.rb', __FILE__)].each {|f| require(f)}
|
25
|
+
define_tests(Unit)
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,197 @@
|
|
1
|
+
class MinispecTest
|
2
|
+
class Mocks < self
|
3
|
+
class Unit
|
4
|
+
include Minispec
|
5
|
+
|
6
|
+
let(:o) { Object.new }
|
7
|
+
|
8
|
+
it 'creates a stub that returns nil' do
|
9
|
+
mock(o, :a)
|
10
|
+
is(o.a).nil?
|
11
|
+
end
|
12
|
+
|
13
|
+
it 'creates a stub that returns a value' do
|
14
|
+
mock(o, :a) {:a}
|
15
|
+
is(o.a) == :a
|
16
|
+
end
|
17
|
+
|
18
|
+
it 'is mocking using a Hash' do
|
19
|
+
mock(o, a: :x, b: :y)
|
20
|
+
does(o).respond_to?(:a)
|
21
|
+
is(o.a) == :x
|
22
|
+
does(o).respond_to?(:b)
|
23
|
+
is(o.b) == :y
|
24
|
+
end
|
25
|
+
|
26
|
+
it 'raise ArgumentError when using constraints on Hash mocks' do
|
27
|
+
does { mock(o, a: :b).with(1) {1} }.raise?(ArgumentError, /can not be used/i)
|
28
|
+
# though error raised, methods should be successfully mocked
|
29
|
+
assert(o.a) == :b
|
30
|
+
end
|
31
|
+
|
32
|
+
it ':fails if expectation not met' do
|
33
|
+
mock(o, :a)
|
34
|
+
end
|
35
|
+
|
36
|
+
it 'calls various stubs depending on given args' do
|
37
|
+
mock(o, :a){0}
|
38
|
+
mock(o, :a).with(1) {1}
|
39
|
+
mock(o, :a).with(2) {2}
|
40
|
+
is(o.a) == 0
|
41
|
+
is(o.a(1)) == 1
|
42
|
+
is(o.a(2)) == 2
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'is mocking private methods' do
|
46
|
+
private_mock(o, :a)
|
47
|
+
does(o.private_methods).include?(:a)
|
48
|
+
does { o.a }.raise? NoMethodError, /private method\W+a/
|
49
|
+
o.send(:a)
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'mocking private methods using a Hash' do
|
53
|
+
private_mock(o, a: :b)
|
54
|
+
does(o.private_methods).include?(:a)
|
55
|
+
does { o.a }.raise? NoMethodError, /private method\W+a/
|
56
|
+
assert(o.send(:a)) == :b
|
57
|
+
end
|
58
|
+
|
59
|
+
it 'is mocking protected methods' do
|
60
|
+
protected_mock(o, :a)
|
61
|
+
does(o.protected_methods).include?(:a)
|
62
|
+
does { o.a }.raise? NoMethodError, /protected method\W+a/
|
63
|
+
o.send(:a)
|
64
|
+
end
|
65
|
+
|
66
|
+
it 'mocking protected methods using a Hash' do
|
67
|
+
protected_mock(o, a: :b)
|
68
|
+
does(o.protected_methods).include?(:a)
|
69
|
+
does { o.a }.raise? NoMethodError, /protected method\W+a/
|
70
|
+
assert(o.send(:a)) == :b
|
71
|
+
end
|
72
|
+
|
73
|
+
it 'keeps the visibility of existing methods' do
|
74
|
+
o = Class.new do
|
75
|
+
def a; end
|
76
|
+
protected
|
77
|
+
def b; p :blah; end
|
78
|
+
private
|
79
|
+
def c; end
|
80
|
+
end.new
|
81
|
+
|
82
|
+
mock(o, :a)
|
83
|
+
o.send(:a)
|
84
|
+
does(o.public_methods).include?(:a)
|
85
|
+
|
86
|
+
mock(o, :b)
|
87
|
+
o.send(:b)
|
88
|
+
does(o.protected_methods).include?(:b)
|
89
|
+
|
90
|
+
mock(o, :c)
|
91
|
+
o.send(:c)
|
92
|
+
does(o.private_methods).include?(:c)
|
93
|
+
end
|
94
|
+
|
95
|
+
it 'uses `with_any` with a block to define a catchall return' do
|
96
|
+
mock(o, :a).
|
97
|
+
with(1) { :one }.
|
98
|
+
with_any { :A }
|
99
|
+
assert(o.a) == :A
|
100
|
+
assert(o.a(:blah)) == :A
|
101
|
+
assert(o.a(1)) == :one
|
102
|
+
end
|
103
|
+
|
104
|
+
it 'uses `with_any` with a value to define a catchall return' do
|
105
|
+
mock(o, :a).
|
106
|
+
with(1) { :one }.
|
107
|
+
with_any(:A)
|
108
|
+
assert(o.a) == :A
|
109
|
+
assert(o.a(:blah)) == :A
|
110
|
+
assert(o.a(1)) == :one
|
111
|
+
end
|
112
|
+
|
113
|
+
it 'is mocking multiple methods at once' do
|
114
|
+
mocks(o, :a, :b)
|
115
|
+
does(o).respond_to?(:a)
|
116
|
+
does(o).respond_to?(:b)
|
117
|
+
o.a
|
118
|
+
o.b
|
119
|
+
end
|
120
|
+
|
121
|
+
it 'is mocking multiple methods at once and :fail if a least one message not received' do
|
122
|
+
mocks(o, :a, :b)
|
123
|
+
o.a
|
124
|
+
# o.b intentionally commented
|
125
|
+
end
|
126
|
+
|
127
|
+
it 'uses given block for all mocks' do
|
128
|
+
mocks(o, :a, :b) {:x}
|
129
|
+
assert(o.a) == :x
|
130
|
+
assert(o.b) == :x
|
131
|
+
end
|
132
|
+
|
133
|
+
it 'uses same constraints for all mocks' do
|
134
|
+
mocks(o, :a, :b).
|
135
|
+
with(1) {:one}.
|
136
|
+
with(2) {:two}.
|
137
|
+
with_any(:any)
|
138
|
+
|
139
|
+
assert(o.a) == :any
|
140
|
+
assert(o.a(:what, :ever)) == :any
|
141
|
+
|
142
|
+
assert(o.b) == :any
|
143
|
+
assert(o.b(:blah)) == :any
|
144
|
+
|
145
|
+
assert(o.a(1)) == :one
|
146
|
+
assert(o.b(1)) == :one
|
147
|
+
|
148
|
+
assert(o.a(2)) == :two
|
149
|
+
assert(o.b(2)) == :two
|
150
|
+
o.a
|
151
|
+
o.b
|
152
|
+
end
|
153
|
+
|
154
|
+
it 'defines multiple private stubs' do
|
155
|
+
private_mocks(o, :a, :b)
|
156
|
+
does(o.private_methods).include?(:a)
|
157
|
+
does(o.private_methods).include?(:b)
|
158
|
+
does { o.a }.raise? NoMethodError, /private method\W+a/
|
159
|
+
does { o.b }.raise? NoMethodError, /private method\W+b/
|
160
|
+
o.send(:a)
|
161
|
+
o.send(:b)
|
162
|
+
end
|
163
|
+
|
164
|
+
it 'defines multiple protected stubs' do
|
165
|
+
protected_mocks(o, :a, :b)
|
166
|
+
does(o.protected_methods).include?(:a)
|
167
|
+
does(o.protected_methods).include?(:b)
|
168
|
+
does { o.a }.raise? NoMethodError, /protected method\W+a/
|
169
|
+
does { o.b }.raise? NoMethodError, /protected method\W+b/
|
170
|
+
o.send(:a)
|
171
|
+
o.send(:b)
|
172
|
+
end
|
173
|
+
|
174
|
+
it 'enforces public visibility on protected methods' do
|
175
|
+
o = Class.new do
|
176
|
+
protected
|
177
|
+
def a; end
|
178
|
+
end.new
|
179
|
+
does { o.a }.raise? NoMethodError, /protected method\W+a/
|
180
|
+
public_mock(o, :a) { :a }
|
181
|
+
assert(o.a) == :a
|
182
|
+
end
|
183
|
+
|
184
|
+
it 'enforces public visibility on private methods' do
|
185
|
+
o = Class.new do
|
186
|
+
private
|
187
|
+
def a; end
|
188
|
+
end.new
|
189
|
+
does { o.a }.raise? NoMethodError, /private method\W+a/
|
190
|
+
public_mock(o, :a) { :a }
|
191
|
+
assert(o.a) == :a
|
192
|
+
end
|
193
|
+
end
|
194
|
+
|
195
|
+
define_tests(Unit)
|
196
|
+
end
|
197
|
+
end
|