rspec_candy 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.
- checksums.yaml +8 -8
- data/README.md +53 -58
- data/gemfiles/Gemfile.rspec1-rails2.lock +4 -1
- data/gemfiles/Gemfile.rspec2-rails3.lock +4 -1
- data/gemfiles/Gemfile.rspec3-rails4.lock +4 -1
- data/lib/rspec_candy/helpers.rb +0 -1
- data/lib/rspec_candy/version.rb +1 -1
- metadata +3 -5
- data/lib/rspec_candy/helpers/rails/it_should_run_callbacks.rb +0 -92
- data/spec/rspec_candy/helpers/rails/it_should_run_callbacks_spec.rb +0 -84
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
NjQyZGUwYzIwZmNlMzJlZmY2NzA5ZDY1MDdiY2QzOWY0M2I3OWNkYQ==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ZGY5ZWE3OTFlNTBhNTZkNmI5OGUyYTUwYjg5Y2FlMDJkOGE0MGY5NQ==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDRmMGNmMGY5ODEwZDI5YzY5OTc2YWUzYjY2NmM2MGRlYjkzNWZlYTNkNWRi
|
10
|
+
NDVmMjlhZGNmYzNjMjRjNDZkYzg2ZWY3MzE0ODc5YjJlZDhjNmRjOWM3M2Zl
|
11
|
+
OWI3YmRmY2Y3N2U4NTA5YzJlNTkzZWEzNGQzMjVjMTgzYjAxYWI=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
YWI4N2E1OWM4ZTI4ZWM1ZGRkZDViYzRiMzdlOGQ5OTM3YzM1NzM0ZTg1NzM0
|
14
|
+
NGIzNWE2M2QwODM4ZGU3NjhhOGU0Y2Y0ODFmODMxOTlhZTZkOTNkMTIzMWNm
|
15
|
+
ZjVhNmIxOWExNTM3NDY1YjhmMDQ2ZmVhYzFhNTU1ODhhYTg3ZWY=
|
data/README.md
CHANGED
@@ -10,28 +10,33 @@ Tested on:
|
|
10
10
|
- RSpec 3 / Rails 4.2
|
11
11
|
|
12
12
|
|
13
|
-
##Installation
|
13
|
+
## Installation
|
14
14
|
|
15
15
|
Add `rspec_candy` to your Gemfile.
|
16
16
|
|
17
17
|
Now, in your `spec_helper.rb`, add this after your RSpec requires:
|
18
18
|
|
19
|
-
|
19
|
+
```ruby
|
20
|
+
require 'rspec_candy/all'
|
21
|
+
```
|
20
22
|
|
21
23
|
If you only care about the matchers or helpers you can also more specifically require:
|
22
24
|
|
23
|
-
|
24
|
-
|
25
|
+
```ruby
|
26
|
+
require 'rspec_candy/matchers'
|
27
|
+
require 'rspec_candy/helpers'
|
28
|
+
```
|
25
29
|
|
26
|
-
|
27
|
-
##Matchers provided
|
30
|
+
## Matchers provided
|
28
31
|
|
29
32
|
**be_same_number_as**
|
30
33
|
|
31
34
|
Tests if the given number is the "same" as the receiving number, regardless of whether you're comparing `Fixnums` (integers), `Floats` and `BigDecimals`:
|
32
35
|
|
33
|
-
|
34
|
-
|
36
|
+
```ruby
|
37
|
+
100.should be_same_number_as(100.0)
|
38
|
+
50.4.should be_same_number_as(BigDecimal('50.4'))
|
39
|
+
```
|
35
40
|
|
36
41
|
Note that "same" means "same for your purposes". Internally the matcher compares normalized results of `#to_s`.
|
37
42
|
|
@@ -39,7 +44,9 @@ If you only care about the matchers or helpers you can also more specifically re
|
|
39
44
|
|
40
45
|
Tests if the given `Time` or `DateTime` is the same as the receiving `Time` or `DateTime`, [ignoring sub-second differences](https://makandracards.com/makandra/1057-why-two-ruby-time-objects-are-not-equal-although-they-appear-to-be):
|
41
46
|
|
42
|
-
|
47
|
+
```ruby
|
48
|
+
Time.parse('2012-12-01 14:00:00.5').should == Time.parse('2012-12-01 14:00')
|
49
|
+
```
|
43
50
|
|
44
51
|
Note that two times in a different time zones will still be considered different.
|
45
52
|
|
@@ -47,12 +54,13 @@ If you only care about the matchers or helpers you can also more specifically re
|
|
47
54
|
|
48
55
|
Matches if the given hash is included in the receiving hash:
|
49
56
|
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
57
|
+
```ruby
|
58
|
+
{ :foo => 'a', :bar => 'b' }.should include_hash(:foo => 'a') # passes
|
59
|
+
{ :foo => 'a', :bar => 'b' }.should include_hash(:foo => 'b') # fails
|
60
|
+
{ :foo => 'a', :bar => 'b' }.should include_hash(:foo => 'a', :baz => 'c') # fails
|
61
|
+
```
|
54
62
|
|
55
|
-
##Helpers provided
|
63
|
+
## Helpers provided
|
56
64
|
|
57
65
|
|
58
66
|
### Extensions to **Object**
|
@@ -65,25 +73,28 @@ If you only care about the matchers or helpers you can also more specifically re
|
|
65
73
|
**should_receive_and_return**
|
66
74
|
|
67
75
|
Expects multiple returns at once:
|
68
|
-
|
69
|
-
dog.should_receive_and_return(:bark => "Woof", :fetch => "stick")
|
70
76
|
|
77
|
+
```ruby
|
78
|
+
dog.should_receive_and_return(:bark => "Woof", :fetch => "stick")
|
79
|
+
```
|
71
80
|
|
72
81
|
**should_receive_chain**
|
73
82
|
|
74
83
|
Expect a chain of method calls:
|
75
84
|
|
76
|
-
|
77
|
-
|
85
|
+
```ruby
|
86
|
+
dog.should_receive_chain(:bark, :upcase).and_return("WOOF")
|
87
|
+
```
|
78
88
|
|
79
89
|
You can also expect arguments, like:
|
80
|
-
|
81
|
-
|
82
|
-
|
90
|
+
|
91
|
+
```ruby
|
92
|
+
dog.should_receive_chain([:bark, 'loudly'], :upcase).and_return("WOOF!!!")
|
93
|
+
```
|
83
94
|
|
84
95
|
**stub_existing**
|
85
96
|
|
86
|
-
Like stub,
|
97
|
+
Like stub, but complains if the method did not exist in the first place.
|
87
98
|
|
88
99
|
|
89
100
|
### Extensions to **Class**
|
@@ -92,18 +103,21 @@ If you only care about the matchers or helpers you can also more specifically re
|
|
92
103
|
|
93
104
|
Like dup for classes. This will temporarily add a method to a class:
|
94
105
|
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
object = copy.new
|
106
|
+
```ruby
|
107
|
+
copy = Model.disposable_copy do
|
108
|
+
def foo; end
|
109
|
+
end
|
100
110
|
|
111
|
+
object = copy.new
|
112
|
+
```
|
101
113
|
|
102
114
|
**new_with_stubs**
|
103
115
|
|
104
116
|
Instantiates and stubs in one call:
|
105
117
|
|
106
|
-
|
118
|
+
```ruby
|
119
|
+
Model.new_with_stubs(:to_param => '1')
|
120
|
+
```
|
107
121
|
|
108
122
|
**stub_any_instance**
|
109
123
|
|
@@ -118,43 +132,26 @@ If you only care about the matchers or helpers you can also more specifically re
|
|
118
132
|
|
119
133
|
Allows parametrizing shared examples, exposes parameters as lets:
|
120
134
|
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
describe Dog do
|
128
|
-
it_should_act_like 'an animal', :expected_noise => 'Woof!'
|
129
|
-
end
|
135
|
+
```ruby
|
136
|
+
shared_examples_for "an animal" do
|
137
|
+
it 'should make noises' do
|
138
|
+
subject.say.should == expected_noise
|
139
|
+
end
|
140
|
+
end
|
130
141
|
|
142
|
+
describe Dog do
|
143
|
+
it_should_act_like 'an animal', :expected_noise => 'Woof!'
|
144
|
+
end
|
145
|
+
```
|
131
146
|
|
132
147
|
Blocks are passed as a let named "block".
|
133
148
|
|
134
149
|
|
135
|
-
**it_should_run_callbacks**
|
136
|
-
|
137
|
-
Only on Rails.
|
138
|
-
|
139
|
-
Check if callbacks are run. Note the name of the describe block is significant:
|
140
|
-
|
141
|
-
describe Model, '#after_save' do
|
142
|
-
it_should_run_callbacks :notify_this, :notify_that
|
143
|
-
end
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
**it_should_run_callbacks_in_order**
|
148
|
-
|
149
|
-
Like `it_should_run_callbacks`, but also checks the correct order.
|
150
|
-
|
151
|
-
|
152
|
-
|
153
150
|
|
154
151
|
### Extensions to **ActiveRecord::Base**
|
155
152
|
|
156
153
|
**store_with_values**
|
157
|
-
|
154
|
+
|
158
155
|
Only on Rails.
|
159
156
|
|
160
157
|
Creates a record without validations or callbacks (like a stub in the database). Can be significantly faster than a factory.
|
@@ -168,5 +165,3 @@ If you only care about the matchers or helpers you can also more specifically re
|
|
168
165
|
- `keep_invalid!` has been renamed to `prevent_storage`
|
169
166
|
- `Object#should_not_receive_and_execute` has been removed (same as `Object#should_not_receive`)
|
170
167
|
- `should_receive_all_with` (over-generic method name for a helper that is rarely useful)
|
171
|
-
|
172
|
-
|
data/lib/rspec_candy/helpers.rb
CHANGED
@@ -10,6 +10,5 @@ require 'rspec_candy/helpers/stub_existing'
|
|
10
10
|
|
11
11
|
if RSpecCandy::Switcher.active_record_loaded?
|
12
12
|
require 'rspec_candy/helpers/rails/store_with_values'
|
13
|
-
require 'rspec_candy/helpers/rails/it_should_run_callbacks'
|
14
13
|
require 'rspec_candy/helpers/rails/prevent_storage'
|
15
14
|
end
|
data/lib/rspec_candy/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rspec_candy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Henning Koch
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2018-01-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rspec
|
@@ -64,7 +64,6 @@ files:
|
|
64
64
|
- lib/rspec_candy/helpers/disposable_copy.rb
|
65
65
|
- lib/rspec_candy/helpers/it_should_act_like.rb
|
66
66
|
- lib/rspec_candy/helpers/new_with_stubs.rb
|
67
|
-
- lib/rspec_candy/helpers/rails/it_should_run_callbacks.rb
|
68
67
|
- lib/rspec_candy/helpers/rails/prevent_storage.rb
|
69
68
|
- lib/rspec_candy/helpers/rails/store_with_values.rb
|
70
69
|
- lib/rspec_candy/helpers/should_receive_and_execute.rb
|
@@ -82,7 +81,6 @@ files:
|
|
82
81
|
- spec/rspec_candy/helpers/disposable_copy_spec.rb
|
83
82
|
- spec/rspec_candy/helpers/it_should_act_like_spec.rb
|
84
83
|
- spec/rspec_candy/helpers/new_with_stubs_spec.rb
|
85
|
-
- spec/rspec_candy/helpers/rails/it_should_run_callbacks_spec.rb
|
86
84
|
- spec/rspec_candy/helpers/rails/prevent_storage_spec.rb
|
87
85
|
- spec/rspec_candy/helpers/rails/store_with_values_spec.rb
|
88
86
|
- spec/rspec_candy/helpers/should_receive_and_execute_spec.rb
|
@@ -120,7 +118,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
120
118
|
version: '0'
|
121
119
|
requirements: []
|
122
120
|
rubyforge_project:
|
123
|
-
rubygems_version: 2.
|
121
|
+
rubygems_version: 2.6.13
|
124
122
|
signing_key:
|
125
123
|
specification_version: 4
|
126
124
|
summary: RSpec helpers and matchers we use in our daily work at makandra.
|
@@ -1,92 +0,0 @@
|
|
1
|
-
module RSpecCandy
|
2
|
-
module Helpers
|
3
|
-
module Rails
|
4
|
-
module ItShouldRunCallbacks
|
5
|
-
|
6
|
-
module ExampleGroupMethods
|
7
|
-
def self.included(by)
|
8
|
-
by.class_eval do
|
9
|
-
|
10
|
-
def it_should_run_callbacks_in_order(*callbacks)
|
11
|
-
callbacks.push(:ordered => true)
|
12
|
-
it_should_run_callbacks(*callbacks)
|
13
|
-
end
|
14
|
-
|
15
|
-
def it_should_run_callbacks(*callbacks)
|
16
|
-
options = callbacks.last.is_a?(Hash) ? callbacks.pop : {}
|
17
|
-
reason = callbacks.pop if callbacks.last.is_a?(String)
|
18
|
-
should = ['should run callbacks', callbacks.inspect, ('in order' if options[:ordered]), reason].compact.join ' '
|
19
|
-
|
20
|
-
prose = case Switcher.rspec_version
|
21
|
-
when 1
|
22
|
-
description_parts.last
|
23
|
-
else
|
24
|
-
description.split(/(?=#)/).last
|
25
|
-
end
|
26
|
-
|
27
|
-
send(:it, should) do
|
28
|
-
extend ExampleMethods
|
29
|
-
callbacks.each do |callback|
|
30
|
-
expectation = subject.should_receive(callback).once
|
31
|
-
expectation.ordered if options[:ordered]
|
32
|
-
end
|
33
|
-
run_all_callbacks(prose)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
module ExampleMethods
|
41
|
-
private
|
42
|
-
|
43
|
-
def run_all_callbacks(prose)
|
44
|
-
run_active_record_callbacks_from_prose(prose)
|
45
|
-
end
|
46
|
-
|
47
|
-
case Switcher.rspec_version
|
48
|
-
when 1
|
49
|
-
|
50
|
-
def run_active_record_callbacks_from_prose(prose)
|
51
|
-
subject.run_callbacks(prose.sub(/^#/, ''))
|
52
|
-
end
|
53
|
-
|
54
|
-
else
|
55
|
-
|
56
|
-
def run_active_record_callbacks_from_prose(prose)
|
57
|
-
hook = prose.split.last.sub(/^#/, '')
|
58
|
-
if hook.sub!(/_on_(create|update)$/, '')
|
59
|
-
condition = "validation_context == :#{$1}"
|
60
|
-
else
|
61
|
-
condition = nil
|
62
|
-
end
|
63
|
-
if hook == 'validate'
|
64
|
-
kind = 'before'
|
65
|
-
action = 'validate'
|
66
|
-
else
|
67
|
-
hook =~ /^(before|after|around)_(.*)$/
|
68
|
-
kind = $1
|
69
|
-
action = $2
|
70
|
-
end
|
71
|
-
# Run all matching callbacks
|
72
|
-
subject.send("_#{action}_callbacks").send(kind == 'after' ? :reverse_each : :each) do |callback|
|
73
|
-
if callback.kind.to_s == kind && (condition.nil? || callback.options[:if].include?(condition))
|
74
|
-
subject.send(callback.filter.to_s.gsub(/[\(,\)]/, '').to_sym) {}
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
end
|
80
|
-
end
|
81
|
-
|
82
|
-
case Switcher.rspec_version
|
83
|
-
when 1
|
84
|
-
Spec::Example::ExampleGroupMethods.send(:include, self::ExampleGroupMethods)
|
85
|
-
else
|
86
|
-
RSpec::Core::ExampleGroup.singleton_class.send(:include, self::ExampleGroupMethods)
|
87
|
-
end
|
88
|
-
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
@@ -1,84 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe RSpecCandy::Helpers::Rails::ItShouldRunCallbacks do
|
4
|
-
|
5
|
-
describe '#it_should_run_callbacks' do
|
6
|
-
|
7
|
-
it 'should pass if all callbacks have been run' do
|
8
|
-
<<-describe_block.should pass_as_describe_block
|
9
|
-
describe Model, '#after_save' do
|
10
|
-
it_should_run_callbacks :after_save_callback2, :after_save_callback1
|
11
|
-
end
|
12
|
-
describe_block
|
13
|
-
end
|
14
|
-
|
15
|
-
it 'should only attempt to run the proper callbacks have been run' do
|
16
|
-
<<-describe_block.should fail_as_describe_block
|
17
|
-
describe Model, '#before_save' do
|
18
|
-
it_should_run_callbacks :after_save_callback2, :after_save_callback1
|
19
|
-
end
|
20
|
-
describe_block
|
21
|
-
end
|
22
|
-
|
23
|
-
it 'should not pass if a callback has not been run' do
|
24
|
-
<<-describe_block.should fail_as_describe_block
|
25
|
-
describe Model, '#after_create' do
|
26
|
-
it_should_run_callbacks :after_create_callback, :unknown_callback
|
27
|
-
end
|
28
|
-
describe_block
|
29
|
-
end
|
30
|
-
|
31
|
-
it 'should not actually execute the callbacks' do
|
32
|
-
<<-describe_block.should pass_as_describe_block
|
33
|
-
def Model.after_save_callback2
|
34
|
-
raise "called!"
|
35
|
-
end
|
36
|
-
|
37
|
-
describe Model, '#after_save' do
|
38
|
-
it_should_run_callbacks :after_save_callback1
|
39
|
-
end
|
40
|
-
describe_block
|
41
|
-
end
|
42
|
-
|
43
|
-
end
|
44
|
-
|
45
|
-
describe '#it_should_run_callbacks_in_order' do
|
46
|
-
|
47
|
-
supported_callbacks = case RSpecCandy::Switcher.rspec_version
|
48
|
-
when 1
|
49
|
-
%w[before after]
|
50
|
-
else
|
51
|
-
%w[before after around]
|
52
|
-
end
|
53
|
-
|
54
|
-
supported_callbacks.each do |kind|
|
55
|
-
|
56
|
-
it "should pass if all #{kind} callbacks are run in order" do
|
57
|
-
<<-describe_block.should pass_as_describe_block
|
58
|
-
describe Model, '##{kind}_save' do
|
59
|
-
it_should_run_callbacks_in_order :#{kind}_save_callback1, :#{kind}_save_callback2
|
60
|
-
end
|
61
|
-
describe_block
|
62
|
-
end
|
63
|
-
|
64
|
-
it "should not pass if a #{kind} callback has not been run" do
|
65
|
-
<<-describe_block.should fail_as_describe_block
|
66
|
-
describe Model, '##{kind}_create' do
|
67
|
-
it_should_run_callbacks_in_order :#{kind}_create_callback, :unknown_callback
|
68
|
-
end
|
69
|
-
describe_block
|
70
|
-
end
|
71
|
-
|
72
|
-
it "should not pass if #{kind} callbacks are run out of order" do
|
73
|
-
<<-describe_block.should fail_as_describe_block
|
74
|
-
describe Model, '##{kind}_save' do
|
75
|
-
it_should_run_callbacks_in_order :#{kind}_save_callback2, :#{kind}_save_callback1
|
76
|
-
end
|
77
|
-
describe_block
|
78
|
-
end
|
79
|
-
|
80
|
-
end
|
81
|
-
|
82
|
-
end
|
83
|
-
|
84
|
-
end
|