rspec-spy 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,7 +1,7 @@
1
1
  # RSpec::Spy
2
2
 
3
3
  This gem allows you to write mock expectations in an AAA (Arrange-Act-Assert) fashion
4
- with RSpec::Mocks. It does this by allowing you to declare examples within a spy block,
4
+ with RSpec::Mocks. It does this by allowing you to declare examples within a `spy` block,
5
5
  which is effectively executed before everything else. Here's a simple example:
6
6
 
7
7
  ``` ruby
@@ -38,16 +38,14 @@ Or install it yourself as:
38
38
 
39
39
  $ gem install rspec-spy
40
40
 
41
- ## Usage
42
-
43
41
  Add to your spec_helper.rb:
44
42
 
45
43
  ``` ruby
46
44
  require 'rspec-spy'
47
45
  ```
48
46
 
49
- If you want to be warned when using should_receive outside of spy blocks (recommended)
50
- add this to your spec_helper.rb:
47
+ If you want to be warned when using `should_receive` outside of `spy` blocks (recommended)
48
+ add this to your `spec_helper.rb`:
51
49
 
52
50
  ``` ruby
53
51
  # Require should_receive and should_not_receive to be inside spy blocks
@@ -55,9 +53,11 @@ add this to your spec_helper.rb:
55
53
  RSpec::Spy.strict_mode = true
56
54
  ```
57
55
 
58
- Now just put your spy expectations within spy blocks in your specs. You should be able to
59
- use all of the functionality from rspec-mocks that you're used to, including spying on
60
- class methods.
56
+ ## Usage
57
+
58
+ Just put your spy expectations within `spy` blocks in your specs instead of in `before` blocks.
59
+ You should be able to use all of the functionality from rspec-mocks that you're
60
+ used to, including spying on class methods.
61
61
 
62
62
  ``` ruby
63
63
  spy do
@@ -75,19 +75,66 @@ end
75
75
  ## Warnings
76
76
 
77
77
  * This is a hack, you'll want to make sure everyone on your team is aware of the behavior
78
- and these warnings. You may not actually even want to use this.
79
- * You should probably avoid instance vars, it gets confusing because you cannot set them
80
- in before blocks and use them in spy blocks. Remember, spy blocks actually happen before
81
- before blocks.
78
+ and these warnings.
79
+ * You should probably avoid instance vars and stick to `let`, it gets confusing because you cannot set them
80
+ in `before` blocks and use them in `spy` blocks. Remember, `spy` blocks actually happen before
81
+ `before` blocks. Example (see the example at the beginning of the readme for the right way):
82
+
83
+ ``` ruby
84
+ describe "what not to do" do
85
+ before do
86
+ @collaborator = stub.as_null_object
87
+ @collaborator.message
88
+ end
89
+
90
+ # These will fail because @collaborator is nil because this happens
91
+ # before the above before block
92
+ spy do
93
+ it "should receive a message" do
94
+ @collaborator.should_receive :message
95
+ end
96
+
97
+ it "should not receive other_message" do
98
+ @collaborator.should_not_receive :other_message
99
+ end
100
+ end
101
+ end
102
+ ```
82
103
  * If your tests depend on the method you are spying on returning something then you'll
83
- need to use `and_return` in your spy block and if you have normal examples you'll also
84
- need to stub it. Yes, this is annoying, but that's how rspec-mocks works.
104
+ need to use `and_return` in your `spy` block and if you have normal examples you'll also
105
+ need to `stub` it. Yes, this is annoying, but that's how rspec-mocks works and it's one
106
+ of the many reasons you shoudln't mock when the return value matters (just `stub`). Example:
107
+
108
+ ``` ruby
109
+ describe "stubbing and mocking at the same time" do
110
+ let(:collaborator) { stub.as_null_object }
111
+ before do
112
+ collaborator.stub(:message) { 5 }
113
+ @result = collaborator.message
114
+
115
+ # This will fail unless you use and_return
116
+ @result.should == 5
117
+ end
118
+
119
+ it "should return 5" do
120
+ # This will fail unless you stub in before
121
+ @result.should == 5
122
+ end
123
+
124
+ spy do
125
+ it "should receive a message" do
126
+ collaborator.should_receive(:message).and_return(5)
127
+ end
128
+ end
129
+ end
130
+ ```
85
131
 
86
132
  ## Alternatives
87
133
 
88
134
  * [matahari](https://github.com/mortice/matahari)
89
135
  * [bourne](https://github.com/thoughtbot/bourne)
90
136
  * [rspec-spies](https://github.com/technicalpickles/rspec-spies)
137
+ * [gimme](https://github.com/searls/gimme)
91
138
 
92
139
  ## Contributing
93
140
 
@@ -3,11 +3,13 @@ require 'rspec/mocks'
3
3
  RSpec::Mocks::Methods.class_eval do
4
4
  def should_receive_with_spy_check(message, opts={}, &block)
5
5
  spy_check(:should_receive)
6
+ nil_check(:should_receive)
6
7
  __mock_proxy.add_message_expectation(opts[:expected_from] || caller(1)[0], message.to_sym, opts, &block)
7
8
  end
8
9
 
9
10
  def should_not_receive_with_spy_check(message, &block)
10
11
  spy_check(:should_not_receive)
12
+ nil_check(:should_not_receive)
11
13
  __mock_proxy.add_negative_message_expectation(caller(1)[0], message.to_sym, &block)
12
14
  end
13
15
 
@@ -23,5 +25,11 @@ RSpec::Mocks::Methods.class_eval do
23
25
  return if RSpec::Spy.ok_to_spy?
24
26
  raise "#{method} should not be used outside of a spy block. Please put it in a spy block or use #{method}!."
25
27
  end
28
+
29
+ def nil_check(method)
30
+ return if RSpec::Mocks::Proxy.allow_message_expectations_on_nil?
31
+ return unless nil?
32
+ raise "You set an expectation on nil, maybe you're using an @instance_var? If you want to do this, use allow_message_expectations_on_nil."
33
+ end
26
34
  end
27
35
 
@@ -1,5 +1,5 @@
1
1
  module RSpec
2
2
  module Spy
3
- VERSION = "0.0.2"
3
+ VERSION = "0.0.3"
4
4
  end
5
5
  end
@@ -86,3 +86,16 @@ describe RSpec::Spy, "shorthand" do
86
86
  collaborator.should_receive :message
87
87
  end
88
88
  end
89
+
90
+ describe RSpec::Spy, "nil warning" do
91
+ spy.it "should warn me if I try to should_receive on nil" do
92
+ lambda { @unknown.should_receive :message }.should raise_error
93
+ lambda { @unknown.should_not_receive :message }.should raise_error
94
+ end
95
+
96
+ spy.it "should not warn me if I allow message expectations on nil" do
97
+ RSpec::Mocks::Proxy.allow_message_expectations_on_nil
98
+ lambda { @unknown.should_not_receive :message }.should_not raise_error
99
+ end
100
+ end
101
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rspec-spy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2012-04-03 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rspec
16
- requirement: &70351465973020 !ruby/object:Gem::Requirement
16
+ requirement: &70355483304080 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ~>
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '2.0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70351465973020
24
+ version_requirements: *70355483304080
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: rspec-mocks
27
- requirement: &70351465972520 !ruby/object:Gem::Requirement
27
+ requirement: &70355483303580 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ~>
@@ -32,7 +32,7 @@ dependencies:
32
32
  version: '2.0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70351465972520
35
+ version_requirements: *70355483303580
36
36
  description: Enables AAA testing for rspec-mock
37
37
  email:
38
38
  - aaronjensen@gmail.com
@@ -79,7 +79,7 @@ rubyforge_project:
79
79
  rubygems_version: 1.8.17
80
80
  signing_key:
81
81
  specification_version: 3
82
- summary: rspec-spy-0.0.2
82
+ summary: rspec-spy-0.0.3
83
83
  test_files:
84
84
  - spec/rspec_spy_spec.rb
85
85
  - spec/spec_helper.rb