orangutan 0.0.5 → 0.0.6
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.
- data/README +15 -5
- data/lib/orangutan/chantek.rb +35 -0
- data/lib/orangutan/mock_adapter.rb +1 -0
- data/lib/orangutan/object_extensions.rb +11 -0
- data/lib/orangutan/stub_base.rb +5 -18
- data/lib/orangutan/stub_include.rb +20 -0
- metadata +4 -2
data/README
CHANGED
@@ -82,6 +82,20 @@ calls.each {|call| puts "#{call.name}.#{call.method}(#{call.args.join(',')})" }
|
|
82
82
|
|
83
83
|
# Recorded call sequences can also be used for assertions in combination with or instead of checking expectations.
|
84
84
|
|
85
|
+
# Stubbing methods on object instances
|
86
|
+
|
87
|
+
register_object :math, Math # registers the object (this just gives the object a name for referencing in calls)
|
88
|
+
stub_method :math, :cos # replaces the implementation of the cos method with a recorder
|
89
|
+
so_when(:math).receives(:cos).with(0).return("i just can't take it anymore")
|
90
|
+
|
91
|
+
# Registering as a mock framework with rspec
|
92
|
+
|
93
|
+
require 'orangutan/mock_adapter'
|
94
|
+
Spec::Runner.configure do |config|
|
95
|
+
# turn off mocking
|
96
|
+
config.mock_with Orangutan::MockAdapter
|
97
|
+
end
|
98
|
+
|
85
99
|
Questions:
|
86
100
|
|
87
101
|
* Why Orangutan?
|
@@ -94,8 +108,4 @@ Definately not. What a ridiculous question. I'm appalled.
|
|
94
108
|
|
95
109
|
* What's Chantek?
|
96
110
|
|
97
|
-
Chantek is a famous orangutan that can solve sudokus and the rubik's cube - http://en.wikipedia.org/wiki/Chantek
|
98
|
-
|
99
|
-
* Why do I not need to register this as a mock framework?
|
100
|
-
|
101
|
-
Most frameworks such as rspec's mocks, mocha and stubba replace methods on existing classes. Because this can't be done with this library - you can only create pure stub objects and setup method behaviours, there's nothing that needs to be undone at the end of a test/example.
|
111
|
+
Chantek is a famous orangutan that can solve sudokus and the rubik's cube - http://en.wikipedia.org/wiki/Chantek
|
data/lib/orangutan/chantek.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
require 'orangutan/object_extensions'
|
1
2
|
require 'orangutan/stub_base'
|
2
3
|
require 'orangutan/expectation'
|
3
4
|
require 'orangutan/call'
|
4
5
|
require 'orangutan/reflector'
|
6
|
+
require 'orangutan/stub_include'
|
5
7
|
|
6
8
|
module Orangutan
|
7
9
|
module Chantek
|
@@ -16,6 +18,37 @@ module Orangutan
|
|
16
18
|
@expectations = {}
|
17
19
|
@stubs= {}
|
18
20
|
@events = {}
|
21
|
+
@stubbed_methods = []
|
22
|
+
end
|
23
|
+
|
24
|
+
def register_object name, object
|
25
|
+
@stubs[name] ||= object
|
26
|
+
end
|
27
|
+
|
28
|
+
def stub_method name, method
|
29
|
+
object = @stubs[name]
|
30
|
+
raise "could not find an object registered with the name #{name}" unless object
|
31
|
+
chantek = self
|
32
|
+
object.instance_eval do
|
33
|
+
@parent = chantek
|
34
|
+
@name = name
|
35
|
+
end
|
36
|
+
@stubbed_methods << [name, method]
|
37
|
+
object.eigen_eval do
|
38
|
+
alias_method("__unstubbed_#{method}", method)
|
39
|
+
end
|
40
|
+
implement_method object.eigen, method
|
41
|
+
end
|
42
|
+
|
43
|
+
def restore_method name, method
|
44
|
+
@stubs[name].eigen_eval do
|
45
|
+
alias_method(method, "__unstubbed_#{method}")
|
46
|
+
end
|
47
|
+
@stubbed_methods.delete [name, method]
|
48
|
+
end
|
49
|
+
|
50
|
+
def restore_methods
|
51
|
+
@stubbed_methods.each {|tuple| restore_method tuple[0], tuple[1]}
|
19
52
|
end
|
20
53
|
|
21
54
|
def stub name, params={}
|
@@ -39,6 +72,8 @@ module Orangutan
|
|
39
72
|
|
40
73
|
def implement_method clazz, name
|
41
74
|
clazz.instance_eval do
|
75
|
+
include StubInclude
|
76
|
+
|
42
77
|
define_method name do |*args|
|
43
78
|
yield_container, return_container = __react__(name, args)
|
44
79
|
yield_container.value.each {|v| yield *v } if yield_container && block_given?
|
data/lib/orangutan/stub_base.rb
CHANGED
@@ -1,7 +1,11 @@
|
|
1
|
+
require 'orangutan/stub_include'
|
2
|
+
|
1
3
|
module Orangutan
|
2
|
-
class StubBase
|
4
|
+
class StubBase
|
3
5
|
instance_methods.each { |m| undef_method m unless m =~ /^__/ }
|
4
6
|
|
7
|
+
include StubInclude
|
8
|
+
|
5
9
|
def initialize name, parent, recursive=false
|
6
10
|
@name, @parent, @recursive = name, parent, recursive
|
7
11
|
end
|
@@ -13,22 +17,5 @@ module Orangutan
|
|
13
17
|
end
|
14
18
|
__return__(method, return_container)
|
15
19
|
end
|
16
|
-
private
|
17
|
-
def __return__ method, return_container
|
18
|
-
return *return_container.value if return_container
|
19
|
-
return @parent.stub(:"#{@name}/#{method}", :recursive => true) if @recursive
|
20
|
-
nil
|
21
|
-
end
|
22
|
-
|
23
|
-
def __react__ method, args
|
24
|
-
yield_container, return_container = nil, nil
|
25
|
-
@parent.calls << Call.new(@name, method, args)
|
26
|
-
first_match = @parent.first_match(@name, method, args)
|
27
|
-
if first_match
|
28
|
-
first_match.raiser.execute if first_match.raiser
|
29
|
-
yield_container, return_container = first_match.yield_container, first_match.return_container
|
30
|
-
end
|
31
|
-
return yield_container, return_container
|
32
|
-
end
|
33
20
|
end
|
34
21
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Orangutan
|
2
|
+
module StubInclude
|
3
|
+
def __return__ method, return_container
|
4
|
+
return *return_container.value if return_container
|
5
|
+
return @parent.stub(:"#{@name}/#{method}", :recursive => true) if @recursive
|
6
|
+
nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def __react__ method, args
|
10
|
+
yield_container, return_container = nil, nil
|
11
|
+
@parent.calls << Call.new(@name, method, args)
|
12
|
+
first_match = @parent.first_match(@name, method, args)
|
13
|
+
if first_match
|
14
|
+
first_match.raiser.execute if first_match.raiser
|
15
|
+
yield_container, return_container = first_match.yield_container, first_match.return_container
|
16
|
+
end
|
17
|
+
return yield_container, return_container
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: orangutan
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mark Ryall
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-03-06 00:00:00 +11:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -29,9 +29,11 @@ files:
|
|
29
29
|
- lib/orangutan/container.rb
|
30
30
|
- lib/orangutan/expectation.rb
|
31
31
|
- lib/orangutan/mock_adapter.rb
|
32
|
+
- lib/orangutan/object_extensions.rb
|
32
33
|
- lib/orangutan/raiser.rb
|
33
34
|
- lib/orangutan/reflector.rb
|
34
35
|
- lib/orangutan/stub_base.rb
|
36
|
+
- lib/orangutan/stub_include.rb
|
35
37
|
- lib/orangutan.rb
|
36
38
|
- README
|
37
39
|
- MIT-LICENSE
|