better_receive 0.1.1 → 0.2.0

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.
@@ -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