surrogate 0.3.1 → 0.3.2
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.md +7 -12
- data/lib/surrogate/endower.rb +8 -3
- data/lib/surrogate/values.rb +1 -8
- data/lib/surrogate/version.rb +1 -1
- data/surrogate.gemspec +1 -1
- metadata +5 -5
data/Readme.md
CHANGED
@@ -251,17 +251,6 @@ user.id.should == 12
|
|
251
251
|
user.should have_been_initialized_with 12
|
252
252
|
```
|
253
253
|
|
254
|
-
Initialization is **always recorded**, so that you don't have to override it just to be able to query.
|
255
|
-
|
256
|
-
```ruby
|
257
|
-
class MockUser < Struct.new(:id)
|
258
|
-
Surrogate.endow self
|
259
|
-
end
|
260
|
-
user = MockUser.new 12
|
261
|
-
user.id.should == 12
|
262
|
-
user.should have_been_initialized_with 12
|
263
|
-
```
|
264
|
-
|
265
254
|
|
266
255
|
Substitutability
|
267
256
|
----------------
|
@@ -356,7 +345,9 @@ Need to put an explanation here soon. In the meantime, I wrote a [blog](http://b
|
|
356
345
|
Special Thanks
|
357
346
|
==============
|
358
347
|
|
359
|
-
* [
|
348
|
+
* [Kyle Hargraves](https://github.com/pd) for changing the name of his internal gem so that I could take Surrogate
|
349
|
+
* [Corey Haines](http://coreyhaines.com/) for pairing on substitutability with me
|
350
|
+
* [Enova](http://www.enovafinancial.com/) for giving me time and motivation to work on this during Enova Labs.
|
360
351
|
* [8th Light](http://8thlight.com/) for giving me time to work on this during our weekly Wazas, and the general encouragement and interest
|
361
352
|
|
362
353
|
|
@@ -377,3 +368,7 @@ Future Features
|
|
377
368
|
* Ability to disassociate the method name from the test (e.g. you shouldn't need to change a test just because you change a name)
|
378
369
|
* declare normal methods as being part of the API (e.g. for inheritance)
|
379
370
|
* assertions for order of invocations & methods
|
371
|
+
* class generator? (supports a top-down style of development for when you write your mocks before you write your implementations)
|
372
|
+
* extract surrogate/rspec into its own gem?
|
373
|
+
* deal with hard dependency on rspec-mocks
|
374
|
+
* support subset-substitutabilty not being able to touch real methods (e.g. #respond_to?)
|
data/lib/surrogate/endower.rb
CHANGED
@@ -3,6 +3,7 @@ class Surrogate
|
|
3
3
|
# Adds surrogate behaviour to your class / singleton class / instances
|
4
4
|
#
|
5
5
|
# please refactor me! ...may not be possible :(
|
6
|
+
# Can we move all method definitions into this class?
|
6
7
|
class Endower
|
7
8
|
def self.endow(klass, &block)
|
8
9
|
new(klass, &block).endow
|
@@ -22,12 +23,11 @@ class Surrogate
|
|
22
23
|
private
|
23
24
|
|
24
25
|
def endow_klass
|
25
|
-
add_hatchery_to klass
|
26
26
|
klass.extend ClassMethods
|
27
|
+
add_hatchery_to klass
|
27
28
|
enable_defining_methods klass
|
28
29
|
record_initialization_for_instances_of klass
|
29
30
|
remember_invocations_for_instances_of klass
|
30
|
-
remember_invocations_for_instances_of klass.singleton_class
|
31
31
|
end
|
32
32
|
|
33
33
|
def endow_singleton_class
|
@@ -35,6 +35,7 @@ class Surrogate
|
|
35
35
|
enable_defining_methods singleton
|
36
36
|
singleton.module_eval &block if block
|
37
37
|
klass.instance_variable_set :@hatchling, Hatchling.new(klass, hatchery)
|
38
|
+
remember_invocations_for_instances_of singleton
|
38
39
|
klass
|
39
40
|
end
|
40
41
|
|
@@ -87,6 +88,9 @@ class Surrogate
|
|
87
88
|
|
88
89
|
# use a module so that the method is inherited (important for substitutability)
|
89
90
|
module ClassMethods
|
91
|
+
|
92
|
+
# Should this be dup? (dup seems to copy singleton methods) and may be able to use #initialize_copy to reset ivars
|
93
|
+
# Can we just remove this feature an instead provide a reset feature which could be hooked into in before/after blocks (e.g. https://github.com/rspec/rspec-core/blob/622505d616d950ed53d12c6e82dbb953ba6241b4/lib/rspec/core/mocking/with_rspec.rb)
|
90
94
|
def clone
|
91
95
|
hatchling, hatchery = @hatchling, @hatchery
|
92
96
|
Class.new self do
|
@@ -97,7 +101,8 @@ class Surrogate
|
|
97
101
|
end
|
98
102
|
end
|
99
103
|
|
100
|
-
# Custom new, because user can define initialize, and
|
104
|
+
# Custom new, because user can define initialize, and we need to record it
|
105
|
+
# Can we move this into the redefinition of initialize and have it explicitly record itself?
|
101
106
|
def new(*args)
|
102
107
|
instance = allocate
|
103
108
|
instance.instance_variable_set :@hatchling, Hatchling.new(instance, @hatchery)
|
data/lib/surrogate/values.rb
CHANGED
@@ -12,7 +12,7 @@ class Surrogate
|
|
12
12
|
elsif arg.kind_of? Exception
|
13
13
|
Raisable.new arg
|
14
14
|
elsif arg.kind_of? Value
|
15
|
-
|
15
|
+
arg
|
16
16
|
else
|
17
17
|
Value.new arg
|
18
18
|
end
|
@@ -45,13 +45,6 @@ class Surrogate
|
|
45
45
|
end
|
46
46
|
|
47
47
|
|
48
|
-
class Recursive < Value
|
49
|
-
def value(hatchling, method_name)
|
50
|
-
@value.value hatchling, method_name
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
|
55
48
|
class MethodQueue < Value
|
56
49
|
QueueEmpty = Class.new StandardError
|
57
50
|
|
data/lib/surrogate/version.rb
CHANGED
data/surrogate.gemspec
CHANGED
@@ -7,7 +7,7 @@ Gem::Specification.new do |s|
|
|
7
7
|
s.version = Surrogate::VERSION
|
8
8
|
s.authors = ["Josh Cheek"]
|
9
9
|
s.email = ["josh.cheek@gmail.com"]
|
10
|
-
s.homepage = ""
|
10
|
+
s.homepage = "https://github.com/JoshCheek/surrogate"
|
11
11
|
s.summary = %q{Framework to aid in handrolling mock/spy objects.}
|
12
12
|
s.description = %q{Framework to aid in handrolling mock/spy objects.}
|
13
13
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: surrogate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.2
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-05-
|
12
|
+
date: 2012-05-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
16
|
-
requirement: &
|
16
|
+
requirement: &70198239716160 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: 2.8.0
|
22
22
|
type: :development
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *70198239716160
|
25
25
|
description: Framework to aid in handrolling mock/spy objects.
|
26
26
|
email:
|
27
27
|
- josh.cheek@gmail.com
|
@@ -55,7 +55,7 @@ files:
|
|
55
55
|
- spec/spec_helper.rb
|
56
56
|
- spec/unit/api_comparer_spec.rb
|
57
57
|
- surrogate.gemspec
|
58
|
-
homepage:
|
58
|
+
homepage: https://github.com/JoshCheek/surrogate
|
59
59
|
licenses: []
|
60
60
|
post_install_message:
|
61
61
|
rdoc_options: []
|