muack 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|