/
delegate.rb
44 lines (39 loc) · 1.07 KB
/
delegate.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
RSpec::Matchers.define :delegate do |delegated_method|
chain :to do |target_method|
@target_method = target_method
end
chain :as do |method_on_target|
@method_on_target = method_on_target
end
chain :with_arguments do |args|
@args = args
end
match do |instance|
extend Mocha::API
@instance = instance
@args ||= []
return_value = 'stubbed return value'
method_on_target = @method_on_target || delegated_method
stubbed_target = stub('stubbed_target', method_on_target => return_value)
@instance.stubs(@target_method => stubbed_target)
begin
@instance.send(delegated_method, *@args) == return_value
rescue NoMethodError
false
end
end
failure_message do
if Class === @instance
message = "expected #{@instance.name} "
prefix = '.'
else
message = "expected #{@instance.class.name} "
prefix = '#'
end
message << "to delegate #{prefix}#{delegated_method} to #{prefix}#{@target_method}"
if @method_on_target
message << ".#{@method_on_target}"
end
message
end
end