muack 0.5.0 → 0.5.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 +4 -4
- data/.gitignore +2 -0
- data/CHANGES.md +6 -0
- data/lib/muack.rb +7 -12
- data/lib/muack/mock.rb +12 -19
- data/lib/muack/modifier.rb +1 -1
- data/lib/muack/session.rb +15 -0
- data/lib/muack/version.rb +1 -1
- data/muack.gemspec +3 -2
- data/test/test_any_instance_of.rb +25 -1
- data/test/test_mock.rb +8 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4ca32470f688bde71bc3a56bed45ead89c3c9123
|
4
|
+
data.tar.gz: c54e8badae54d1b321cf5c95cc0facdc36b2a604
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7cfb937f5866fa9b92380029a3b2327874b4e28a0e87bb99652e7f0550a8b62731cd0bea78d2854bb2b379ce7dd1734cc5c837333b6463724adbf5cb8733dbbb
|
7
|
+
data.tar.gz: b47a79b28dbfe31d81e78c99308ef45596556531436bcd8294987b5d688301cdfbbee8a8eb7d8437712337b3e39a44f70085ac1b50ca16512faf58bdb9676ddb
|
data/.gitignore
ADDED
data/CHANGES.md
CHANGED
@@ -1,5 +1,11 @@
|
|
1
1
|
# CHANGES
|
2
2
|
|
3
|
+
## Muack 0.5.1 -- 2013-06-25
|
4
|
+
|
5
|
+
* Fix issues with multiple call to any_instance_of with the same class.
|
6
|
+
* any_instance_of now accepts a block as mock and others.
|
7
|
+
* Fixed various bugs for dispatching methods with proxy and any_instance_of.
|
8
|
+
|
3
9
|
## Muack 0.5.0 -- 2013-06-24
|
4
10
|
|
5
11
|
* Birthday!
|
data/lib/muack.rb
CHANGED
@@ -1,12 +1,6 @@
|
|
1
1
|
|
2
|
-
require 'muack/mock'
|
3
|
-
require 'muack/stub'
|
4
|
-
require 'muack/proxy'
|
5
|
-
|
6
|
-
require 'muack/satisfy'
|
7
2
|
require 'muack/session'
|
8
|
-
|
9
|
-
require 'muack/any_instance_of'
|
3
|
+
require 'muack/satisfy'
|
10
4
|
|
11
5
|
module Muack
|
12
6
|
def self.verify
|
@@ -27,27 +21,28 @@ module Muack
|
|
27
21
|
module API
|
28
22
|
module_function
|
29
23
|
def mock obj=Object.new
|
30
|
-
ret = Muack.session
|
24
|
+
ret = Muack.session.mock(obj)
|
31
25
|
if block_given? then yield(ret) else ret end
|
32
26
|
end
|
33
27
|
|
34
28
|
def stub obj=Object.new
|
35
|
-
ret = Muack.session
|
29
|
+
ret = Muack.session.stub(obj)
|
36
30
|
if block_given? then yield(ret) else ret end
|
37
31
|
end
|
38
32
|
|
39
33
|
def mock_proxy obj=Object.new
|
40
|
-
ret = Muack.session
|
34
|
+
ret = Muack.session.mock_proxy(obj)
|
41
35
|
if block_given? then yield(ret) else ret end
|
42
36
|
end
|
43
37
|
|
44
38
|
def stub_proxy obj=Object.new
|
45
|
-
ret = Muack.session
|
39
|
+
ret = Muack.session.stub_proxy(obj)
|
46
40
|
if block_given? then yield(ret) else ret end
|
47
41
|
end
|
48
42
|
|
49
43
|
def any_instance_of klass
|
50
|
-
|
44
|
+
ret = Muack.session.any_instance_of(klass)
|
45
|
+
if block_given? then yield(ret) else ret end
|
51
46
|
end
|
52
47
|
|
53
48
|
def is_a klass
|
data/lib/muack/mock.rb
CHANGED
@@ -8,7 +8,7 @@ module Muack
|
|
8
8
|
attr_reader :object
|
9
9
|
def initialize object
|
10
10
|
@object = object
|
11
|
-
@
|
11
|
+
@__mock_injected = {}
|
12
12
|
[:__mock_defis=, :__mock_disps=].each do |m|
|
13
13
|
__send__(m, ::Hash.new{ |h, k| h[k] = [] })
|
14
14
|
end
|
@@ -22,7 +22,11 @@ module Muack
|
|
22
22
|
# Public API: Define mocked method
|
23
23
|
def method_missing msg, *args, &block
|
24
24
|
defi = Definition.new(msg, args, block)
|
25
|
-
|
25
|
+
if injected = __mock_injected[defi.msg]
|
26
|
+
defi.original_method = injected.original_method
|
27
|
+
else
|
28
|
+
__mock_inject_method(defi)
|
29
|
+
end
|
26
30
|
__mock_defis_push(defi)
|
27
31
|
Modifier.new(self, defi)
|
28
32
|
end
|
@@ -37,11 +41,6 @@ module Muack
|
|
37
41
|
__mock_defis[defi.msg].pop
|
38
42
|
end
|
39
43
|
|
40
|
-
# used for Muack::Modifier#times
|
41
|
-
def __mock_ignore defi
|
42
|
-
@__mock_ignore << defi
|
43
|
-
end
|
44
|
-
|
45
44
|
# used for mocked object to dispatch mocked method
|
46
45
|
def __mock_dispatch msg, actual_args, actual_block
|
47
46
|
if defi = __mock_defis[msg].shift
|
@@ -77,14 +76,11 @@ module Muack
|
|
77
76
|
|
78
77
|
# used for Muack::Session#reset
|
79
78
|
def __mock_reset
|
80
|
-
|
81
|
-
flatten.compact.each do |defi|
|
79
|
+
__mock_injected.each_value do |defi|
|
82
80
|
object.singleton_class.module_eval do
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
end
|
87
|
-
if methods.include?(defi.original_method) # restore original method
|
81
|
+
remove_method(defi.msg)
|
82
|
+
# restore original method
|
83
|
+
if instance_methods(false).include?(defi.original_method)
|
88
84
|
alias_method defi.msg, defi.original_method
|
89
85
|
remove_method defi.original_method
|
90
86
|
end
|
@@ -93,14 +89,11 @@ module Muack
|
|
93
89
|
end
|
94
90
|
|
95
91
|
protected # get warnings for private attributes
|
96
|
-
attr_accessor :__mock_defis, :__mock_disps
|
92
|
+
attr_accessor :__mock_defis, :__mock_disps, :__mock_injected
|
97
93
|
|
98
94
|
private
|
99
|
-
def __mock_pure? defi
|
100
|
-
__mock_defis[defi.msg].empty? && __mock_disps[defi.msg].empty?
|
101
|
-
end
|
102
|
-
|
103
95
|
def __mock_inject_method defi
|
96
|
+
__mock_injected[defi.msg] = defi
|
104
97
|
target = object.singleton_class
|
105
98
|
Mock.store_original_method(target, defi)
|
106
99
|
__mock_inject_mock_method(target, defi)
|
data/lib/muack/modifier.rb
CHANGED
@@ -14,7 +14,7 @@ module Muack
|
|
14
14
|
if number >= 1
|
15
15
|
(number - 1).times{ mock.__mock_defis_push(defi) }
|
16
16
|
elsif number == 0
|
17
|
-
mock.
|
17
|
+
mock.__mock_defis_pop(defi)
|
18
18
|
else
|
19
19
|
raise "What would you expect from calling a method #{number} times?"
|
20
20
|
end
|
data/lib/muack/session.rb
CHANGED
@@ -1,12 +1,27 @@
|
|
1
1
|
|
2
|
+
require 'muack/mock'
|
3
|
+
require 'muack/stub'
|
4
|
+
require 'muack/proxy'
|
5
|
+
require 'muack/any_instance_of'
|
6
|
+
|
2
7
|
module Muack
|
3
8
|
class Session < Hash
|
9
|
+
def mock obj; self["mk #{obj.__id__}"] ||= Mock .new(obj); end
|
10
|
+
def stub obj; self["sb #{obj.__id__}"] ||= Stub .new(obj); end
|
11
|
+
def mock_proxy obj; self["mp #{obj.__id__}"] ||= MockProxy.new(obj); end
|
12
|
+
def stub_proxy obj; self["sp #{obj.__id__}"] ||= StubProxy.new(obj); end
|
13
|
+
|
14
|
+
def any_instance_of klass
|
15
|
+
(@any_instance_of ||= {})[klass.__id__] ||= AnyInstanceOf.new(klass)
|
16
|
+
end
|
17
|
+
|
4
18
|
def verify
|
5
19
|
each_value.all?(&:__mock_verify)
|
6
20
|
end
|
7
21
|
|
8
22
|
def reset
|
9
23
|
each_value(&:__mock_reset)
|
24
|
+
clear
|
10
25
|
end
|
11
26
|
end
|
12
27
|
end
|
data/lib/muack/version.rb
CHANGED
data/muack.gemspec
CHANGED
@@ -2,14 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = "muack"
|
5
|
-
s.version = "0.5.
|
5
|
+
s.version = "0.5.1"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Lin Jen-Shin (godfat)"]
|
9
|
-
s.date = "2013-06-
|
9
|
+
s.date = "2013-06-25"
|
10
10
|
s.description = "Muack -- Yet another mocking library.\n\nBasically it's an [RR][] clone, but much faster under heavy use.\nIt's 32x times faster (750s vs 23s) for running [Rib][] tests.\n\n[RR]: https://github.com/rr/rr\n[Rib]: https://github.com/godfat/rib"
|
11
11
|
s.email = ["godfat (XD) godfat.org"]
|
12
12
|
s.files = [
|
13
|
+
".gitignore",
|
13
14
|
".gitmodules",
|
14
15
|
".travis.yml",
|
15
16
|
"CHANGES.md",
|
@@ -16,15 +16,39 @@ describe Muack::AnyInstanceOf do
|
|
16
16
|
klass = Class.new{ def f; true; end }
|
17
17
|
any_instance_of(klass){ |instance| mock_proxy(instance).f }
|
18
18
|
obj = klass.new
|
19
|
-
obj.f.should.eq true
|
19
|
+
obj.f .should.eq true
|
20
20
|
Muack.verify.should.eq true
|
21
|
+
obj.f .should.eq true
|
21
22
|
end
|
22
23
|
|
23
24
|
should 'proxy any_instance_of with a block' do
|
24
25
|
klass = Class.new{ def f; 0; end }
|
25
26
|
any_instance_of(klass){ |instance| mock_proxy(instance).f{ |i| i+1 } }
|
26
27
|
obj = klass.new
|
28
|
+
obj.f .should.eq 1
|
29
|
+
Muack.verify.should.eq true
|
30
|
+
obj.f .should.eq 0
|
31
|
+
end
|
32
|
+
|
33
|
+
should 'proxy with multiple any_instance_of call' do
|
34
|
+
klass = Class.new{ def f; 0; end }
|
35
|
+
any_instance_of(klass){ |instance| mock_proxy(instance).f{ |i| i+1 } }
|
36
|
+
any_instance_of(klass){ |instance| mock_proxy(instance).f{ |i| i+2 } }
|
37
|
+
obj = klass.new
|
27
38
|
obj.f.should.eq 1
|
39
|
+
obj.f.should.eq 2
|
40
|
+
Muack.verify.should.eq true
|
41
|
+
obj.f.should.eq 0
|
42
|
+
end
|
43
|
+
|
44
|
+
should 'mock with multiple any_instance_of call' do
|
45
|
+
klass = Class.new{ def f; 0; end }
|
46
|
+
any_instance_of(klass){ |inst| mock(inst).f(is_a(Fixnum)){ |i| i+1 } }
|
47
|
+
any_instance_of(klass){ |inst| mock(inst).f(is_a(Fixnum)){ |i| i+2 } }
|
48
|
+
obj = klass.new
|
49
|
+
obj.f(0).should.eq 1
|
50
|
+
obj.f(0).should.eq 2
|
28
51
|
Muack.verify.should.eq true
|
52
|
+
obj.f.should.eq 0
|
29
53
|
end
|
30
54
|
end
|
data/test/test_mock.rb
CHANGED
@@ -68,6 +68,14 @@ describe Muack::Mock do
|
|
68
68
|
mock(Obj).say{1}
|
69
69
|
Obj.say.should.eq 1
|
70
70
|
end
|
71
|
+
|
72
|
+
should 'not remove original singleton method' do
|
73
|
+
obj = Class.new{ def self.f; 0; end }
|
74
|
+
2.times{ mock(obj).f{ 1 } }
|
75
|
+
2.times{ obj.f.should.eq 1 }
|
76
|
+
Muack.verify.should.eq true
|
77
|
+
obj.f .should.eq 0
|
78
|
+
end
|
71
79
|
end
|
72
80
|
|
73
81
|
describe 'Muack.verify==false' do
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: muack
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lin Jen-Shin (godfat)
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-06-
|
11
|
+
date: 2013-06-25 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: |-
|
14
14
|
Muack -- Yet another mocking library.
|
@@ -24,6 +24,7 @@ executables: []
|
|
24
24
|
extensions: []
|
25
25
|
extra_rdoc_files: []
|
26
26
|
files:
|
27
|
+
- .gitignore
|
27
28
|
- .gitmodules
|
28
29
|
- .travis.yml
|
29
30
|
- CHANGES.md
|