better_receive 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,29 +1,66 @@
1
1
  module BetterReceive
2
2
  class Mock
3
- attr_reader :expectation, :object
4
3
 
5
4
  def initialize(object)
6
5
  @object = object
7
6
  end
8
7
 
9
- def verify(selector, options, &block)
10
- object.should respond_to(selector)
8
+ def responds_to_and_receives(selector, options, &block)
9
+ better_respond_to(selector)
11
10
 
12
11
  mock_method(selector, options, &block)
13
12
  end
14
13
 
14
+ def rspec_verify
15
+ end
16
+
15
17
  private
16
18
 
17
- def mock_method(selector, options, &block)
18
- mock_proxy = object.send(:__mock_proxy)
19
+ attr_reader :object
19
20
 
20
- location = options[:expected_from] || caller(1)[2]
21
- @expectation = mock_proxy.add_message_expectation(location, selector, options, &block)
21
+ def better_respond_to(selector)
22
+ case object
23
+ when RSpec::Mocks::AnyInstance::Recorder
24
+ any_instance_should_respond_to selector
25
+ else
26
+ object.should respond_to(selector)
27
+ end
28
+ end
29
+
30
+ def any_instance_should_respond_to(selector)
31
+ klass = object.instance_variable_get(:@klass)
32
+ unless klass.method_defined?(selector)
33
+ raise "Expected instances of #{klass.name} to respond to :#{selector}"
34
+ end
22
35
  end
23
36
 
24
37
  def respond_to(selector)
25
38
  RSpec::Matchers::BuiltIn::RespondTo.new(selector)
26
39
  end
27
40
 
41
+ def mock_method(selector, options, &block)
42
+ case object
43
+ when RSpec::Mocks::AnyInstance::Recorder
44
+ any_instance_should_receive selector, &block
45
+ else
46
+ location = options[:expected_from] || caller(1)[2]
47
+ mock_proxy.add_message_expectation(location, selector, options, &block)
48
+ end
49
+ end
50
+
51
+ def any_instance_should_receive(selector, &block)
52
+ RSpec::Mocks::space.add(object)
53
+
54
+ object.instance_variable_set(:@expectation_set, true)
55
+ object.send(:observe!, selector)
56
+
57
+ expectation_chain = RSpec::Mocks::AnyInstance::PositiveExpectationChain.new(selector, &block)
58
+ object.message_chains.add(selector, expectation_chain)
59
+ end
60
+
61
+ def mock_proxy
62
+ @mock_proxy ||= object.send(:__mock_proxy)
63
+ end
64
+
28
65
  end
29
66
  end
@@ -1,3 +1,3 @@
1
1
  module BetterReceive
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -3,7 +3,7 @@ require "better_receive/mock"
3
3
 
4
4
  module BetterReceive
5
5
  def better_receive(method_name, options={}, &block)
6
- Mock.new(self).verify(method_name, options, &block)
6
+ Mock.new(self).responds_to_and_receives(method_name, options, &block)
7
7
  end
8
8
  end
9
9
 
@@ -60,6 +60,40 @@ describe BetterReceive do
60
60
  foo.better_receive(:bar, passed: true, &block_param)
61
61
  end
62
62
  end
63
+
64
+ context "on .any_instance" do
65
+ context "when the method is defined" do
66
+ context "and the method is called" do
67
+ it 'does not raise an error' do
68
+ expect {
69
+ Foo.any_instance.better_receive(:bar)
70
+ foo.bar
71
+ }.to_not raise_error
72
+ end
73
+ end
74
+
75
+ context 'and the method is not called' do
76
+ it 'does raise an error' do
77
+ expect {
78
+ Foo.any_instance.better_receive(:bar)
79
+ RSpec::Mocks::space.verify_all
80
+ }.to raise_error(RSpec::Mocks::MockExpectationError) { |error|
81
+ error.message.should == "Exactly one instance should have received the following message(s) but didn't: bar"
82
+ }
83
+ end
84
+ end
85
+ end
86
+
87
+ context 'when the method is not defined' do
88
+ it 'raises an error' do
89
+ expect {
90
+ Foo.any_instance.better_receive(:baz)
91
+ }.to raise_error { |error|
92
+ error.message.should == "Expected instances of Foo to respond to :baz"
93
+ }
94
+ end
95
+ end
96
+ end
63
97
  end
64
98
  end
65
99
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_receive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-13 00:00:00.000000000 Z
13
+ date: 2013-01-15 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rspec