better_receive 0.4.1 → 0.5.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.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 2374b6397328e21d63f479e68e74a2dfdc843960
4
+ data.tar.gz: c4e755a254de947b2fe8bed0bcca4e390177a513
5
+ SHA512:
6
+ metadata.gz: 9c755925be275f776cb9e7bfc86372785b96fb96a348583b2d03252d4e4b4771f13ab7189652a6e498f7de6cbdc7937d87406c129a71b324fc4b8a00289412b8
7
+ data.tar.gz: 2692f614cf4c2803c7f24e91fa9fc92ec545c5e54432aadc9a943934155ac54900bcb0c16ee9cb25c0c82121811ff00d853bd4d786c281288fd1e84abc211085
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .ruby-version
6
7
  Gemfile.lock
7
8
  InstalledFiles
8
9
  _yardoc
data/README.md CHANGED
@@ -20,6 +20,8 @@ foo.better_receive(:bar)
20
20
  foo.better_stub(bar: 1, baz: 2)
21
21
  # or
22
22
  Foo.any_instance.better_receive(:bar).with(:wibble)
23
+ # or
24
+ foo.better_not_receive(:bar_baz)
23
25
 
24
26
  ```
25
27
 
@@ -8,6 +8,10 @@ module BetterReceive
8
8
  Mock.new(self).assert_with(*args, &block)
9
9
  end
10
10
 
11
+ def better_not_receive(*args, &block)
12
+ Mock.new(self).assert_negative_with(*args, &block)
13
+ end
14
+
11
15
  def better_stub(*args, &block)
12
16
  Stub.new(self).assert_with(*args, &block)
13
17
  end
@@ -27,6 +27,11 @@ module BetterReceive
27
27
  any_instance_add_expectation selector, &block
28
28
  end
29
29
 
30
+ def any_instance_better_not_expect(selector, options, &block)
31
+ any_instance_should_respond_to selector
32
+ any_instance_add_negative_expectation selector, &block
33
+ end
34
+
30
35
  def any_instance_should_respond_to(selector)
31
36
  klass = subject.instance_variable_get(:@klass)
32
37
  unless klass.method_defined?(selector)
@@ -43,5 +48,14 @@ module BetterReceive
43
48
  subject.message_chains.add(selector, expectation_chain(selector, &block))
44
49
  end
45
50
 
51
+ def any_instance_add_negative_expectation(selector, &block)
52
+ RSpec::Mocks::space.add(subject)
53
+
54
+ subject.instance_variable_set(:@expectation_set, true)
55
+ subject.send(:observe!, selector)
56
+
57
+ subject.message_chains.add(selector, negative_expectation_chain(selector, &block))
58
+ end
59
+
46
60
  end
47
61
  end
@@ -2,6 +2,7 @@ module BetterReceive
2
2
  class Mock < Base
3
3
 
4
4
  def assert_with(selector, options={}, &block)
5
+ selector = selector.to_sym
5
6
  if subject_is_any_instance?
6
7
  any_instance_better_expect(selector, options, &block)
7
8
  else
@@ -10,6 +11,16 @@ module BetterReceive
10
11
  end
11
12
  end
12
13
 
14
+ def assert_negative_with(selector, options={}, &block)
15
+ selector = selector.to_sym
16
+ if subject_is_any_instance?
17
+ any_instance_better_not_expect(selector, options, &block)
18
+ else
19
+ subject.should respond_to selector
20
+ negative_mock_subject_method(selector, options, &block)
21
+ end
22
+ end
23
+
13
24
 
14
25
  private
15
26
 
@@ -18,6 +29,11 @@ module BetterReceive
18
29
  subject_mock_proxy.add_message_expectation(location, selector, options, &block)
19
30
  end
20
31
 
32
+ def negative_mock_subject_method(selector, options, &block)
33
+ location = options[:expected_from] || caller(1)[2]
34
+ subject_mock_proxy.add_negative_message_expectation(location, selector, &block)
35
+ end
36
+
21
37
  def expectation_chain(*args)
22
38
  if defined?(RSpec::Mocks::AnyInstance::PositiveExpectationChain)
23
39
  RSpec::Mocks::AnyInstance::PositiveExpectationChain.new(*args)
@@ -26,5 +42,13 @@ module BetterReceive
26
42
  end
27
43
  end
28
44
 
45
+ def negative_expectation_chain(*args)
46
+ if defined?(RSpec::Mocks::AnyInstance::NegativeExpectationChain)
47
+ RSpec::Mocks::AnyInstance::NegativeExpectationChain.new(*args)
48
+ else
49
+ RSpec::Mocks::AnyInstance::NegativeExpectationChain.new(*args)
50
+ end
51
+ end
52
+
29
53
  end
30
54
  end
@@ -15,6 +15,7 @@ module BetterReceive
15
15
  private
16
16
 
17
17
  def better_stub_method(selector, options, &block)
18
+ selector = selector.to_sym
18
19
  if subject_is_any_instance?
19
20
  any_instance_better_expect(selector, options, &block)
20
21
  else
@@ -1,3 +1,3 @@
1
1
  module BetterReceive
2
- BETTER_VERSION = "0.4.1"
2
+ BETTER_VERSION = "0.5.0"
3
3
  end
@@ -60,6 +60,15 @@ describe BetterReceive::Mock do
60
60
 
61
61
  br_mock.assert_with(:bar, passed: true, &block_param)
62
62
  end
63
+
64
+ it "converts the selector to a symbol if necessary" do
65
+ foo.should_receive(:send).with(:__mock_proxy).and_return(mock_proxy)
66
+ mock_proxy.should_receive(:add_message_expectation) do |*args, &block|
67
+ args[1].should == :bar
68
+ end
69
+
70
+ br_mock.assert_with('bar', passed: true, &block_param)
71
+ end
63
72
  end
64
73
 
65
74
  context "on .any_instance" do
@@ -99,4 +108,106 @@ describe BetterReceive::Mock do
99
108
  end
100
109
  end
101
110
  end
111
+
112
+ describe "#assert_negative_with" do
113
+ let(:foo) { Foo.new }
114
+ let(:br_mock) { BetterReceive::Mock.new(foo) }
115
+
116
+ it "raises an error if the method is not defined" do
117
+ expect {
118
+ br_mock.assert_negative_with :bar_baz
119
+ }.to raise_error(RSpec::Expectations::ExpectationNotMetError) { |error|
120
+ error.message.should =~ /to respond to :bar_baz/
121
+ }
122
+ end
123
+
124
+ context "when mocking" do
125
+ let(:mock_proxy) { double(RSpec::Mocks::Proxy) }
126
+
127
+ it "creates a mock proxy and adds an expectation to it" do
128
+ foo.should_receive(:send).with(:__mock_proxy).and_return(mock_proxy)
129
+ mock_proxy.should_receive(:add_negative_message_expectation)
130
+
131
+ br_mock.assert_negative_with :bar
132
+ end
133
+
134
+ it "returns an rspec message expectation(responds to additional matchers ('with', 'once'...))" do
135
+ foo.better_not_receive(:bar).should be_a RSpec::Mocks::NegativeMessageExpectation
136
+
137
+ expect {
138
+ foo.bar
139
+ }.to raise_error(RSpec::Mocks::MockExpectationError) { |error|
140
+ error.message.should include "received: 1 time"
141
+ }
142
+
143
+ br_mock.assert_negative_with(:bar).with('wibble')
144
+ expect {
145
+ foo.bar('wibble')
146
+ }.to raise_error(RSpec::Mocks::MockExpectationError) { |error|
147
+ error.message.should include "received: 1 time"
148
+ }
149
+
150
+ end
151
+
152
+ context "and passing arguments" do
153
+ let(:block_param) { Proc.new {} }
154
+ let(:options) { {passed: true} }
155
+
156
+ it "passes all arguments through to the mock_proxy" do
157
+ foo.should_receive(:send).with(:__mock_proxy).and_return(mock_proxy)
158
+ mock_proxy.should_receive(:add_negative_message_expectation) do |*args, &block|
159
+ args[1].should == :bar
160
+ block.should == block_param
161
+ end
162
+
163
+ br_mock.assert_negative_with(:bar, &block_param)
164
+ end
165
+
166
+ it "converts the selector to a symbol" do
167
+ foo.should_receive(:send).with(:__mock_proxy).and_return(mock_proxy)
168
+ mock_proxy.should_receive(:add_negative_message_expectation) do |*args, &block|
169
+ args[1].should == :bar
170
+ end
171
+
172
+ br_mock.assert_negative_with("bar", &block_param)
173
+ end
174
+ end
175
+
176
+ context "on .any_instance" do
177
+ let(:br_mock) { BetterReceive::Mock.new(Foo.any_instance) }
178
+
179
+ context "when the method is defined" do
180
+ context "and the method is called" do
181
+ it 'raises when called' do
182
+ expect {
183
+ br_mock.assert_negative_with(:bar)
184
+ foo.bar
185
+ }.to raise_error(RSpec::Mocks::MockExpectationError) { |error|
186
+ error.message.should include "received: 1 time"
187
+ }
188
+ end
189
+ end
190
+
191
+ context 'and the method is not called' do
192
+ it 'does not raise an error' do
193
+ expect {
194
+ br_mock.assert_negative_with(:bar)
195
+ RSpec::Mocks::space.verify_all
196
+ }.to_not raise_error
197
+ end
198
+ end
199
+ end
200
+
201
+ context 'when the method is not defined' do
202
+ it 'raises an error' do
203
+ expect {
204
+ br_mock.assert_negative_with(:baz)
205
+ }.to raise_error { |error|
206
+ error.message.should == "Expected instances of Foo to respond to :baz"
207
+ }
208
+ end
209
+ end
210
+ end
211
+ end
212
+ end
102
213
  end
@@ -51,14 +51,23 @@ describe BetterReceive::Stub do
51
51
  it "passes all arguments through to the mock_proxy" do
52
52
  foo.should_receive(:send).with(:__mock_proxy).and_return(mock_proxy)
53
53
  mock_proxy.should_receive(:add_stub) do |*args, &block|
54
- args[1].should == :bar
55
- args[2].should == options
56
- block.should == block_param
54
+ args[1].should == :bar
55
+ args[2].should == options
56
+ block.should == block_param
57
57
  end
58
58
 
59
59
  br_stub.assert_with(:bar, passed: true, &block_param)
60
60
  end
61
61
 
62
+ it "converts the selector to a string" do
63
+ foo.should_receive(:send).with(:__mock_proxy).and_return(mock_proxy)
64
+ mock_proxy.should_receive(:add_stub) do |*args, &block|
65
+ args[1].should == :bar
66
+ end
67
+
68
+ br_stub.assert_with("bar", passed: true, &block_param)
69
+ end
70
+
62
71
  it "returns the value passed in the block" do
63
72
  br_stub.assert_with(:bar) { :baz }
64
73
 
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: better_receive
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
5
- prerelease:
4
+ version: 0.5.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - Steve Ellis
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2013-02-07 00:00:00.000000000 Z
12
+ date: 2013-06-27 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: rspec
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,33 +28,29 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: rake
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
- - - ! '>='
32
+ - - '>='
37
33
  - !ruby/object:Gem::Version
38
34
  version: '0'
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
- - - ! '>='
39
+ - - '>='
45
40
  - !ruby/object:Gem::Version
46
41
  version: '0'
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: pry
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
- - - ! '>='
46
+ - - '>='
53
47
  - !ruby/object:Gem::Version
54
48
  version: '0'
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
- - - ! '>='
53
+ - - '>='
61
54
  - !ruby/object:Gem::Version
62
55
  version: '0'
63
56
  description: Assert that an object responds to a method before asserting that the
@@ -87,27 +80,26 @@ files:
87
80
  - spec/spec_helper.rb
88
81
  homepage: http://github.com/se3000/better_receive
89
82
  licenses: []
83
+ metadata: {}
90
84
  post_install_message:
91
85
  rdoc_options: []
92
86
  require_paths:
93
87
  - lib
94
88
  required_ruby_version: !ruby/object:Gem::Requirement
95
- none: false
96
89
  requirements:
97
- - - ! '>='
90
+ - - '>='
98
91
  - !ruby/object:Gem::Version
99
92
  version: '0'
100
93
  required_rubygems_version: !ruby/object:Gem::Requirement
101
- none: false
102
94
  requirements:
103
- - - ! '>='
95
+ - - '>='
104
96
  - !ruby/object:Gem::Version
105
97
  version: '0'
106
98
  requirements: []
107
99
  rubyforge_project:
108
- rubygems_version: 1.8.23
100
+ rubygems_version: 2.0.0
109
101
  signing_key:
110
- specification_version: 3
102
+ specification_version: 4
111
103
  summary: A more assertive mock.
112
104
  test_files:
113
105
  - spec/lib/better_receive/mock_spec.rb