stubborn 0.1.4 → 0.1.5
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/VERSION +1 -1
- data/lib/missed_stub_exception.rb +2 -2
- data/lib/stubborn.rb +31 -7
- data/lib/suggesters/rspec_suggester.rb +1 -1
- data/stubborn.gemspec +1 -1
- data/test/stubborn_test.rb +69 -27
- data/test/suggesters/rspec_suggester_test.rb +6 -2
- metadata +1 -1
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.1.
|
1
|
+
0.1.5
|
@@ -15,12 +15,12 @@ module Stubborn
|
|
15
15
|
private
|
16
16
|
def friendly_name(object)
|
17
17
|
return "\"#{object}\"" if object.respond_to?(:to_str)
|
18
|
-
return object.inspect if object.respond_to?(:to_int) || object.is_a?(Hash)
|
18
|
+
return object.inspect if object.respond_to?(:to_int) || object.is_a?(Hash) || object.nil? || object == true || object == false
|
19
19
|
|
20
20
|
if object.is_a?(Class)
|
21
21
|
object.name
|
22
22
|
else
|
23
|
-
"#{object.class.name.downcase}_instance"
|
23
|
+
"#{object.class.name.downcase.gsub(/\W+/, '_')}_instance"
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
data/lib/stubborn.rb
CHANGED
@@ -28,16 +28,36 @@ module Stubborn
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def method_missing(method_name, *args, &block)
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
comes_from_another = comes_from_another_method_missing?
|
32
|
+
begin
|
33
|
+
set_comes_from_another
|
34
|
+
result = @proxy_target.send(method_name, *args, &block)
|
35
|
+
return result if @methods_to_skip.include?(method_name.to_s) || comes_from_another
|
36
|
+
raise MissedStubException.new(@label || @proxy_target, method_name, args, result, Suggesters::RSpecSuggester)
|
37
|
+
ensure
|
38
|
+
clear_comes_from_another unless comes_from_another
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
private
|
43
|
+
def comes_from_another_method_missing?
|
44
|
+
Thread.current["stubborn_objects_ids"] = {} if Thread.current["stubborn_objects_ids"].nil?
|
45
|
+
Thread.current["stubborn_objects_ids"][self.__id__]
|
46
|
+
end
|
47
|
+
|
48
|
+
def set_comes_from_another
|
49
|
+
Thread.current["stubborn_objects_ids"][self.__id__] = true
|
50
|
+
end
|
51
|
+
|
52
|
+
def clear_comes_from_another
|
53
|
+
Thread.current["stubborn_objects_ids"].delete(self.__id__)
|
34
54
|
end
|
35
55
|
end
|
36
56
|
|
37
57
|
class ProxyForClass < ProxyForInstance
|
38
58
|
def initialize(proxy_target, options = {})
|
39
59
|
super
|
40
|
-
redefine_const(proxy_target
|
60
|
+
redefine_const(proxy_target, self) unless proxy_target.name.strip.empty?
|
41
61
|
end
|
42
62
|
|
43
63
|
def name
|
@@ -50,9 +70,13 @@ module Stubborn
|
|
50
70
|
end
|
51
71
|
|
52
72
|
private
|
53
|
-
def redefine_const(
|
54
|
-
|
55
|
-
|
73
|
+
def redefine_const(const, value)
|
74
|
+
const_parts = const.name.split('::')
|
75
|
+
const_name = const_parts.pop
|
76
|
+
parent_const = const_parts.inject(Object){|a, c| a.const_get(c) }
|
77
|
+
|
78
|
+
parent_const.__send__(:remove_const, const_name) if parent_const.const_defined?(const_name)
|
79
|
+
parent_const.const_set(const_name, value)
|
56
80
|
end
|
57
81
|
end
|
58
82
|
end
|
@@ -3,7 +3,7 @@ module Stubborn
|
|
3
3
|
module RSpecSuggester
|
4
4
|
def self.suggestions(object_label, method_name, args, result)
|
5
5
|
with = args.strip.empty? ? nil : ".with(#{args})"
|
6
|
-
and_return = result
|
6
|
+
and_return = result == "nil" ? nil : ".and_return(#{result})"
|
7
7
|
suggestions = []
|
8
8
|
suggestions << "#{object_label}.stub!(:#{method_name})#{with}#{and_return}"
|
9
9
|
suggestions << "#{object_label}.stub!(:#{method_name})#{and_return}"
|
data/stubborn.gemspec
CHANGED
data/test/stubborn_test.rb
CHANGED
@@ -1,29 +1,42 @@
|
|
1
1
|
require 'test_helper'
|
2
2
|
|
3
|
+
module Test; end
|
4
|
+
|
3
5
|
def reset_test_api_class
|
4
|
-
name = "
|
5
|
-
|
6
|
+
name = "Api"
|
7
|
+
Test.__send__(:remove_const, name) if Test.const_defined?(name)
|
6
8
|
klass = Class.new do
|
7
9
|
def plus_one(number)
|
8
10
|
number + 1
|
9
11
|
end
|
10
12
|
|
13
|
+
def plus_three(number)
|
14
|
+
number = plus_one(number)
|
15
|
+
number = plus_one(number)
|
16
|
+
plus_one(number)
|
17
|
+
end
|
18
|
+
|
11
19
|
def self.plus_two(number)
|
12
20
|
number + 2
|
13
21
|
end
|
22
|
+
|
23
|
+
def self.plus_four(number)
|
24
|
+
number = Test::Api.plus_two(number)
|
25
|
+
Test::Api.plus_two(number)
|
26
|
+
end
|
14
27
|
end
|
15
|
-
|
28
|
+
Test.const_set(name, klass)
|
16
29
|
end
|
17
30
|
|
18
31
|
Expectations do
|
19
32
|
expect 2 do
|
20
33
|
reset_test_api_class
|
21
|
-
|
34
|
+
Test::Api.new.plus_one(1)
|
22
35
|
end
|
23
36
|
|
24
|
-
expect "
|
37
|
+
expect "Test::Api" do
|
25
38
|
reset_test_api_class
|
26
|
-
api =
|
39
|
+
api = Test::Api.new
|
27
40
|
api = Stubborn.should_be_stubbed(api)
|
28
41
|
api.class.name
|
29
42
|
end
|
@@ -31,16 +44,16 @@ Expectations do
|
|
31
44
|
%w[is_a? kind_of?].each do |method|
|
32
45
|
expect true do
|
33
46
|
reset_test_api_class
|
34
|
-
api =
|
47
|
+
api = Test::Api.new
|
35
48
|
api = Stubborn.should_be_stubbed(api)
|
36
|
-
api.send(method,
|
49
|
+
api.send(method, Test::Api)
|
37
50
|
end
|
38
51
|
end
|
39
52
|
|
40
53
|
%w[equal? eql? == ===].each do |method|
|
41
54
|
expect true do
|
42
55
|
reset_test_api_class
|
43
|
-
api =
|
56
|
+
api = Test::Api.new
|
44
57
|
proxied_api = Stubborn.should_be_stubbed(api)
|
45
58
|
proxied_api.send(method, api)
|
46
59
|
end
|
@@ -48,28 +61,28 @@ Expectations do
|
|
48
61
|
|
49
62
|
expect true do
|
50
63
|
reset_test_api_class
|
51
|
-
api =
|
64
|
+
api = Test::Api.new
|
52
65
|
api = Stubborn.should_be_stubbed(api)
|
53
66
|
api.respond_to?(:plus_one)
|
54
67
|
end
|
55
68
|
|
56
69
|
expect Stubborn::MissedStubException do
|
57
70
|
reset_test_api_class
|
58
|
-
api =
|
71
|
+
api = Test::Api.new
|
59
72
|
api = Stubborn.should_be_stubbed(api)
|
60
73
|
api.plus_one(1)
|
61
74
|
end
|
62
75
|
|
63
76
|
expect 3 do
|
64
77
|
reset_test_api_class
|
65
|
-
api =
|
78
|
+
api = Test::Api.new
|
66
79
|
api = Stubborn.should_be_stubbed(api)
|
67
80
|
api.class.plus_two(1)
|
68
81
|
end
|
69
82
|
|
70
|
-
expect "You've missed adding a stub. Consider this suggestions:\
|
83
|
+
expect "You've missed adding a stub. Consider this suggestions:\ntest_api_instance.stub!(:plus_one).with(0).and_return(1)\ntest_api_instance.stub!(:plus_one).and_return(1)" do
|
71
84
|
reset_test_api_class
|
72
|
-
api =
|
85
|
+
api = Test::Api.new
|
73
86
|
api = Stubborn.should_be_stubbed(api)
|
74
87
|
message = ""
|
75
88
|
begin
|
@@ -81,7 +94,7 @@ Expectations do
|
|
81
94
|
|
82
95
|
expect "You've missed adding a stub. Consider this suggestions:\nApi.singleton.stub!(:plus_one).with(0).and_return(1)\nApi.singleton.stub!(:plus_one).and_return(1)" do
|
83
96
|
reset_test_api_class
|
84
|
-
api =
|
97
|
+
api = Test::Api.new
|
85
98
|
api = Stubborn.should_be_stubbed(api, :label => "Api.singleton")
|
86
99
|
message = ""
|
87
100
|
begin
|
@@ -91,45 +104,74 @@ Expectations do
|
|
91
104
|
end
|
92
105
|
end
|
93
106
|
|
94
|
-
expect "
|
107
|
+
expect "Test::Api" do
|
95
108
|
reset_test_api_class
|
96
|
-
Stubborn.should_be_stubbed(
|
97
|
-
api =
|
109
|
+
Stubborn.should_be_stubbed(Test::Api)
|
110
|
+
api = Test::Api.new
|
98
111
|
api.class.name
|
99
112
|
end
|
100
113
|
|
101
114
|
expect true do
|
102
115
|
reset_test_api_class
|
103
|
-
Stubborn.should_be_stubbed(
|
104
|
-
api =
|
116
|
+
Stubborn.should_be_stubbed(Test::Api)
|
117
|
+
api = Test::Api.new
|
105
118
|
api.respond_to?(:plus_one)
|
106
119
|
end
|
107
120
|
|
108
121
|
expect Stubborn::MissedStubException do
|
109
122
|
reset_test_api_class
|
110
|
-
Stubborn.should_be_stubbed(
|
111
|
-
api =
|
123
|
+
Stubborn.should_be_stubbed(Test::Api)
|
124
|
+
api = Test::Api.new
|
112
125
|
api.plus_one(1)
|
113
126
|
end
|
114
127
|
|
115
128
|
expect Stubborn::MissedStubException do
|
116
129
|
reset_test_api_class
|
117
|
-
Stubborn.should_be_stubbed(
|
118
|
-
api =
|
130
|
+
Stubborn.should_be_stubbed(Test::Api)
|
131
|
+
api = Test::Api.new
|
119
132
|
api.class.plus_two(1)
|
120
133
|
end
|
121
134
|
|
122
|
-
expect
|
135
|
+
expect Stubborn::MissedStubException do
|
123
136
|
reset_test_api_class
|
124
|
-
Stubborn.should_be_stubbed(
|
137
|
+
Stubborn.should_be_stubbed(Test::Api)
|
138
|
+
Test::Api.plus_two(1)
|
139
|
+
end
|
140
|
+
|
141
|
+
expect "You've missed adding a stub. Consider this suggestions:\ntest_api_instance.stub!(:plus_one).with(0).and_return(1)\ntest_api_instance.stub!(:plus_one).and_return(1)" do
|
142
|
+
reset_test_api_class
|
143
|
+
Stubborn.should_be_stubbed(Test::Api)
|
125
144
|
message = ""
|
126
|
-
api =
|
145
|
+
api = Test::Api.new
|
127
146
|
begin
|
128
147
|
api.plus_one(0)
|
129
148
|
rescue => e
|
130
149
|
message = e.message
|
131
150
|
end
|
132
151
|
end
|
152
|
+
|
153
|
+
expect "You've missed adding a stub. Consider this suggestions:\ntest_api_instance.stub!(:plus_three).with(1).and_return(4)\ntest_api_instance.stub!(:plus_three).and_return(4)" do
|
154
|
+
reset_test_api_class
|
155
|
+
Stubborn.should_be_stubbed(Test::Api)
|
156
|
+
message = ""
|
157
|
+
api = Test::Api.new
|
158
|
+
begin
|
159
|
+
api.plus_three(1)
|
160
|
+
rescue => e
|
161
|
+
message = e.message
|
162
|
+
end
|
163
|
+
end
|
164
|
+
|
165
|
+
expect "You've missed adding a stub. Consider this suggestions:\nTest::Api.stub!(:plus_four).with(1).and_return(5)\nTest::Api.stub!(:plus_four).and_return(5)" do
|
166
|
+
reset_test_api_class
|
167
|
+
Stubborn.should_be_stubbed(Test::Api)
|
168
|
+
message = ""
|
169
|
+
begin
|
170
|
+
Test::Api.plus_four(1)
|
171
|
+
rescue => e
|
172
|
+
message = e.message
|
173
|
+
end
|
174
|
+
end
|
133
175
|
end
|
134
176
|
|
135
177
|
|
@@ -6,8 +6,8 @@ class Api; end
|
|
6
6
|
include Stubborn
|
7
7
|
|
8
8
|
Expectations do
|
9
|
-
expect "You've missed adding a stub. Consider this suggestions:\napi_instance.stub!(:method).with(123, AClass, \"hi\", {1=>2}).and_return(aclass_instance)\napi_instance.stub!(:method).and_return(aclass_instance)" do
|
10
|
-
MissedStubException.new(Api.new, :method, [123, AClass,"hi", {1 => 2}], AClass.new, Suggesters::RSpecSuggester).message
|
9
|
+
expect "You've missed adding a stub. Consider this suggestions:\napi_instance.stub!(:method).with(true, false, 123, AClass, \"hi\", {1=>2}).and_return(aclass_instance)\napi_instance.stub!(:method).and_return(aclass_instance)" do
|
10
|
+
MissedStubException.new(Api.new, :method, [true, false, 123, AClass,"hi", {1 => 2}], AClass.new, Suggesters::RSpecSuggester).message
|
11
11
|
end
|
12
12
|
|
13
13
|
expect "You've missed adding a stub. Consider this suggestion:\napi_instance.stub!(:method).and_return(aclass_instance)" do
|
@@ -17,5 +17,9 @@ Expectations do
|
|
17
17
|
expect "You've missed adding a stub. Consider this suggestion:\nApi.singleton.stub!(:method).and_return(aclass_instance)" do
|
18
18
|
MissedStubException.new("Api.singleton", :method, [], AClass.new, Suggesters::RSpecSuggester).message
|
19
19
|
end
|
20
|
+
|
21
|
+
expect "You've missed adding a stub. Consider this suggestion:\nApi.singleton.stub!(:method)" do
|
22
|
+
MissedStubException.new("Api.singleton", :method, [], nil, Suggesters::RSpecSuggester).message
|
23
|
+
end
|
20
24
|
end
|
21
25
|
|