remarkable_rails 3.0.1 → 3.0.2
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.
- data/CHANGELOG +44 -44
- data/LICENSE +1 -1
- data/README +83 -83
- data/lib/remarkable_rails/action_controller/base.rb +24 -24
- data/lib/remarkable_rails/action_controller/macro_stubs.rb +493 -493
- data/lib/remarkable_rails/action_controller/matchers/assign_to_matcher.rb +72 -72
- data/lib/remarkable_rails/action_controller/matchers/filter_params_matcher.rb +21 -21
- data/lib/remarkable_rails/action_controller/matchers/redirect_to_matcher.rb +112 -112
- data/lib/remarkable_rails/action_controller/matchers/render_template_matcher.rb +140 -140
- data/lib/remarkable_rails/action_controller/matchers/respond_with_matcher.rb +118 -118
- data/lib/remarkable_rails/action_controller/matchers/route_matcher.rb +51 -51
- data/lib/remarkable_rails/action_controller/matchers/set_session_matcher.rb +103 -103
- data/lib/remarkable_rails/action_controller/matchers/set_the_flash_matcher.rb +50 -50
- data/lib/remarkable_rails/action_view/base.rb +1 -1
- data/lib/remarkable_rails/action_view.rb +16 -16
- data/lib/remarkable_rails/active_orm.rb +2 -2
- data/locale/en.yml +74 -74
- data/spec/action_controller/assign_to_matcher_spec.rb +68 -68
- data/spec/action_controller/filter_params_matcher_spec.rb +42 -42
- data/spec/action_controller/macro_stubs_spec.rb +17 -17
- data/spec/action_controller/redirect_to_matcher_spec.rb +60 -60
- data/spec/action_controller/render_template_matcher_spec.rb +227 -227
- data/spec/action_controller/respond_with_matcher_spec.rb +189 -189
- data/spec/action_controller/route_matcher_spec.rb +75 -75
- data/spec/action_controller/set_session_matcher_spec.rb +43 -43
- data/spec/action_controller/set_the_flash_matcher_spec.rb +1 -1
- data/spec/application/application.rb +14 -14
- data/spec/application/tasks_controller.rb +34 -34
- data/spec/functional_builder.rb +93 -93
- data/spec/spec_helper.rb +44 -44
- metadata +4 -4
@@ -1,80 +1,80 @@
|
|
1
1
|
module Remarkable
|
2
2
|
module ActionController
|
3
|
-
module Matchers
|
4
|
-
# Do not inherit from ActionController::Base since it don't need all macro stubs behavior.
|
3
|
+
module Matchers
|
4
|
+
# Do not inherit from ActionController::Base since it don't need all macro stubs behavior.
|
5
5
|
class RouteMatcher < Remarkable::Base #:nodoc:
|
6
|
-
arguments :method, :path
|
7
|
-
|
6
|
+
arguments :method, :path
|
7
|
+
|
8
8
|
assertions :map_to_path?, :generate_params?
|
9
|
-
|
10
|
-
before_assert do
|
11
|
-
@options[:controller] ||= controller_name
|
12
|
-
|
13
|
-
@populated_path = @path.dup
|
9
|
+
|
10
|
+
before_assert do
|
11
|
+
@options[:controller] ||= controller_name
|
12
|
+
|
13
|
+
@populated_path = @path.dup
|
14
14
|
|
15
15
|
@options.each do |key, value|
|
16
16
|
@options[key] = value.to_param if value.respond_to?(:to_param)
|
17
17
|
@populated_path.gsub!(key.inspect, value.to_s)
|
18
18
|
end
|
19
19
|
|
20
|
-
::ActionController::Routing::Routes.reload if ::ActionController::Routing::Routes.empty?
|
21
|
-
end
|
20
|
+
::ActionController::Routing::Routes.reload if ::ActionController::Routing::Routes.empty?
|
21
|
+
end
|
22
22
|
|
23
23
|
private
|
24
|
-
|
24
|
+
|
25
25
|
def map_to_path?
|
26
26
|
route_for = ::ActionController::Routing::Routes.generate(@options) rescue nil
|
27
27
|
return route_for == @populated_path, :actual => route_for.inspect
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
def generate_params?
|
31
31
|
params_from = ::ActionController::Routing::Routes.recognize_path(@populated_path, :method => @method.to_sym)
|
32
32
|
return params_from == @options, :actual => params_from.inspect
|
33
|
-
end
|
34
|
-
|
35
|
-
# First tries to get the controller name from the subject, then from
|
36
|
-
# the spec class using controller class or finally, from the described
|
37
|
-
# class.
|
38
|
-
#
|
39
|
-
# We have to try the described class because we don't have neither the
|
40
|
-
# subject or the controller class in the RoutingExampleGroup.
|
41
|
-
#
|
42
|
-
def controller_name
|
43
|
-
spec_class = @spec.class unless @spec.class == Class
|
44
|
-
|
45
|
-
controller = if @subject && @subject.class.ancestors.include?(::ActionController::Base)
|
46
|
-
@subject.class
|
47
|
-
elsif spec_class.respond_to?(:controller_class)
|
48
|
-
spec_class.controller_class
|
49
|
-
elsif spec_class.respond_to?(:described_class)
|
50
|
-
spec_class.described_class
|
51
|
-
end
|
52
|
-
|
53
|
-
if controller && controller.ancestors.include?(::ActionController::Base)
|
54
|
-
controller.name.gsub(/Controller$/, '').tableize
|
55
|
-
else
|
56
|
-
raise ArgumentError, "I cannot guess the controller name in route. Please supply :controller as option"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def interpolation_options
|
61
|
-
{ :options => @options.inspect, :method => @method.to_s.upcase, :path => @path.inspect }
|
62
|
-
end
|
63
|
-
|
33
|
+
end
|
34
|
+
|
35
|
+
# First tries to get the controller name from the subject, then from
|
36
|
+
# the spec class using controller class or finally, from the described
|
37
|
+
# class.
|
38
|
+
#
|
39
|
+
# We have to try the described class because we don't have neither the
|
40
|
+
# subject or the controller class in the RoutingExampleGroup.
|
41
|
+
#
|
42
|
+
def controller_name
|
43
|
+
spec_class = @spec.class unless @spec.class == Class
|
44
|
+
|
45
|
+
controller = if @subject && @subject.class.ancestors.include?(::ActionController::Base)
|
46
|
+
@subject.class
|
47
|
+
elsif spec_class.respond_to?(:controller_class)
|
48
|
+
spec_class.controller_class
|
49
|
+
elsif spec_class.respond_to?(:described_class)
|
50
|
+
spec_class.described_class
|
51
|
+
end
|
52
|
+
|
53
|
+
if controller && controller.ancestors.include?(::ActionController::Base)
|
54
|
+
controller.name.gsub(/Controller$/, '').tableize
|
55
|
+
else
|
56
|
+
raise ArgumentError, "I cannot guess the controller name in route. Please supply :controller as option"
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def interpolation_options
|
61
|
+
{ :options => @options.inspect, :method => @method.to_s.upcase, :path => @path.inspect }
|
62
|
+
end
|
63
|
+
|
64
64
|
end
|
65
65
|
|
66
|
-
# Assert route generation AND route recognition.
|
67
|
-
#
|
66
|
+
# Assert route generation AND route recognition.
|
67
|
+
#
|
68
68
|
# == Examples
|
69
|
-
#
|
69
|
+
#
|
70
70
|
# # autodetects the :controller
|
71
71
|
# should_route :get, '/posts', :action => :index
|
72
72
|
#
|
73
73
|
# # explicitly specify :controller
|
74
|
-
# should_route :post, '/posts', :controller => :posts, :action => :create
|
74
|
+
# should_route :post, '/posts', :controller => :posts, :action => :create
|
75
75
|
#
|
76
76
|
# # non-string parameter
|
77
|
-
# should_route :get, '/posts/1', :controller => :posts, :action => :show, :id => 1
|
77
|
+
# should_route :get, '/posts/1', :controller => :posts, :action => :show, :id => 1
|
78
78
|
#
|
79
79
|
# # string-parameter
|
80
80
|
# should_route :put, '/posts/1', :controller => :posts, :action => :update, :id => "1"
|
@@ -85,9 +85,9 @@ module Remarkable
|
|
85
85
|
# should_route :get, '/users/5/posts', :controller => :posts, :action => :index, :user_id => 5
|
86
86
|
# should_route :post, '/users/5/posts', :controller => :posts, :action => :create, :user_id => 5
|
87
87
|
#
|
88
|
-
def route(*params)
|
88
|
+
def route(*params)
|
89
89
|
RouteMatcher.new(*params).spec(self)
|
90
|
-
end
|
90
|
+
end
|
91
91
|
|
92
92
|
end
|
93
93
|
end
|
@@ -1,108 +1,108 @@
|
|
1
1
|
module Remarkable
|
2
2
|
module ActionController
|
3
3
|
module Matchers
|
4
|
-
class SetSessionMatcher < Remarkable::ActionController::Base #:nodoc:
|
5
|
-
arguments :collection => :keys, :as => :key, :block => :block
|
6
|
-
|
7
|
-
optional :to
|
8
|
-
|
9
|
-
assertion :is_not_empty?, :contains_value?
|
10
|
-
collection_assertions :assigned_value?, :is_equal_value?
|
11
|
-
|
12
|
-
before_assert :evaluate_expected_value
|
13
|
-
|
14
|
-
private
|
15
|
-
|
16
|
-
# When no keys are given:
|
17
|
-
#
|
18
|
-
# should set_session
|
19
|
-
#
|
20
|
-
# We check if the session is not empty.
|
21
|
-
#
|
22
|
-
def is_not_empty?
|
23
|
-
!(@keys.empty? && session.empty?)
|
24
|
-
end
|
25
|
-
|
26
|
-
# When no keys are given and a comparision value is given:
|
27
|
-
#
|
28
|
-
# should set_session.to(1)
|
29
|
-
#
|
30
|
-
# We check if any of the session data contains the given value.
|
31
|
-
#
|
32
|
-
def contains_value?
|
33
|
-
return true unless @keys.empty? && value_to_compare?
|
34
|
-
assert_contains(session.values, @options[:to])
|
35
|
-
end
|
36
|
-
|
37
|
-
def assigned_value?
|
38
|
-
session.key?(@key)
|
39
|
-
end
|
40
|
-
|
41
|
-
# Returns true if :to is not given and no block is given.
|
42
|
-
# In case :to is a proc or a block is given, we evaluate it in the
|
43
|
-
# @spec scope.
|
44
|
-
#
|
45
|
-
def is_equal_value?
|
46
|
-
return true unless value_to_compare?
|
47
|
-
session[@key] == @options[:to]
|
48
|
-
end
|
49
|
-
|
50
|
-
def session
|
51
|
-
raw_session.with_indifferent_access.except(:flash)
|
52
|
-
end
|
53
|
-
|
54
|
-
def raw_session
|
55
|
-
@subject ? @subject.response.session.data : {}
|
56
|
-
end
|
57
|
-
|
58
|
-
def value_to_compare?
|
59
|
-
@options.key?(:to) || @block
|
60
|
-
end
|
61
|
-
|
62
|
-
def interpolation_options
|
63
|
-
{ :session_inspect => raw_session.except('flash').symbolize_keys!.inspect }
|
64
|
-
end
|
65
|
-
|
66
|
-
# Evaluate procs before assert to avoid them appearing in descriptions.
|
67
|
-
def evaluate_expected_value
|
68
|
-
if value_to_compare?
|
69
|
-
value = @options.key?(:to) ? @options[:to] : @block
|
70
|
-
value = @spec.instance_eval(&value) if value.is_a?(Proc)
|
71
|
-
@options[:to] = value
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
# Ensures that a session keys were set. If you want to check that a variable
|
78
|
-
# is not being set, please do:
|
79
|
-
#
|
80
|
-
# should_not_set_session(:user)
|
81
|
-
#
|
82
|
-
# If you want to assure that a variable is being set to nil, do instead:
|
83
|
-
#
|
84
|
-
# should_set_session(:user).to(nil)
|
85
|
-
#
|
86
|
-
# == Options
|
87
|
-
#
|
88
|
-
# * <tt>:to</tt> - The value to compare the session key.
|
89
|
-
# It accepts procs and be also given as a block (see examples below).
|
4
|
+
class SetSessionMatcher < Remarkable::ActionController::Base #:nodoc:
|
5
|
+
arguments :collection => :keys, :as => :key, :block => :block
|
6
|
+
|
7
|
+
optional :to
|
8
|
+
|
9
|
+
assertion :is_not_empty?, :contains_value?
|
10
|
+
collection_assertions :assigned_value?, :is_equal_value?
|
11
|
+
|
12
|
+
before_assert :evaluate_expected_value
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# When no keys are given:
|
17
|
+
#
|
18
|
+
# should set_session
|
19
|
+
#
|
20
|
+
# We check if the session is not empty.
|
21
|
+
#
|
22
|
+
def is_not_empty?
|
23
|
+
!(@keys.empty? && session.empty?)
|
24
|
+
end
|
25
|
+
|
26
|
+
# When no keys are given and a comparision value is given:
|
27
|
+
#
|
28
|
+
# should set_session.to(1)
|
29
|
+
#
|
30
|
+
# We check if any of the session data contains the given value.
|
31
|
+
#
|
32
|
+
def contains_value?
|
33
|
+
return true unless @keys.empty? && value_to_compare?
|
34
|
+
assert_contains(session.values, @options[:to])
|
35
|
+
end
|
36
|
+
|
37
|
+
def assigned_value?
|
38
|
+
session.key?(@key)
|
39
|
+
end
|
40
|
+
|
41
|
+
# Returns true if :to is not given and no block is given.
|
42
|
+
# In case :to is a proc or a block is given, we evaluate it in the
|
43
|
+
# @spec scope.
|
44
|
+
#
|
45
|
+
def is_equal_value?
|
46
|
+
return true unless value_to_compare?
|
47
|
+
session[@key] == @options[:to]
|
48
|
+
end
|
49
|
+
|
50
|
+
def session
|
51
|
+
raw_session.with_indifferent_access.except(:flash)
|
52
|
+
end
|
53
|
+
|
54
|
+
def raw_session
|
55
|
+
@subject ? @subject.response.session.data : {}
|
56
|
+
end
|
57
|
+
|
58
|
+
def value_to_compare?
|
59
|
+
@options.key?(:to) || @block
|
60
|
+
end
|
61
|
+
|
62
|
+
def interpolation_options
|
63
|
+
{ :session_inspect => raw_session.except('flash').symbolize_keys!.inspect }
|
64
|
+
end
|
65
|
+
|
66
|
+
# Evaluate procs before assert to avoid them appearing in descriptions.
|
67
|
+
def evaluate_expected_value
|
68
|
+
if value_to_compare?
|
69
|
+
value = @options.key?(:to) ? @options[:to] : @block
|
70
|
+
value = @spec.instance_eval(&value) if value.is_a?(Proc)
|
71
|
+
@options[:to] = value
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
|
77
|
+
# Ensures that a session keys were set. If you want to check that a variable
|
78
|
+
# is not being set, please do:
|
79
|
+
#
|
80
|
+
# should_not_set_session(:user)
|
81
|
+
#
|
82
|
+
# If you want to assure that a variable is being set to nil, do instead:
|
83
|
+
#
|
84
|
+
# should_set_session(:user).to(nil)
|
85
|
+
#
|
86
|
+
# == Options
|
87
|
+
#
|
88
|
+
# * <tt>:to</tt> - The value to compare the session key.
|
89
|
+
# It accepts procs and be also given as a block (see examples below).
|
90
90
|
#
|
91
91
|
# == Examples
|
92
|
-
#
|
93
|
-
# should_set_session :user_id, :user
|
94
|
-
# should_set_session :user_id, :to => 2
|
95
|
-
# should_set_session :user, :to => proc{ users(:first) }
|
96
|
-
# should_set_session(:user){ users(:first) }
|
97
|
-
#
|
98
|
-
# it { should set_session(:user_id, :user) }
|
99
|
-
# it { should set_session(:user_id, :to => 2) }
|
100
|
-
# it { should set_session(:user, :to => users(:first)) }
|
101
|
-
#
|
102
|
-
def set_session(*args, &block)
|
103
|
-
SetSessionMatcher.new(*args, &block).spec(self)
|
104
|
-
end
|
105
|
-
|
106
|
-
end
|
107
|
-
end
|
108
|
-
end
|
92
|
+
#
|
93
|
+
# should_set_session :user_id, :user
|
94
|
+
# should_set_session :user_id, :to => 2
|
95
|
+
# should_set_session :user, :to => proc{ users(:first) }
|
96
|
+
# should_set_session(:user){ users(:first) }
|
97
|
+
#
|
98
|
+
# it { should set_session(:user_id, :user) }
|
99
|
+
# it { should set_session(:user_id, :to => 2) }
|
100
|
+
# it { should set_session(:user, :to => users(:first)) }
|
101
|
+
#
|
102
|
+
def set_session(*args, &block)
|
103
|
+
SetSessionMatcher.new(*args, &block).spec(self)
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end
|
@@ -1,55 +1,55 @@
|
|
1
|
-
require File.join(File.dirname(__FILE__), 'set_session_matcher')
|
2
|
-
|
1
|
+
require File.join(File.dirname(__FILE__), 'set_session_matcher')
|
2
|
+
|
3
3
|
module Remarkable
|
4
4
|
module ActionController
|
5
5
|
module Matchers
|
6
|
-
class SetTheFlashMatcher < SetSessionMatcher #:nodoc:
|
7
|
-
|
8
|
-
protected
|
9
|
-
def session
|
10
|
-
@subject ? (@subject.response.session['flash'] || {}) : {}
|
11
|
-
end
|
12
|
-
|
13
|
-
def interpolation_options
|
14
|
-
{ :flash_inspect => session.symbolize_keys!.inspect }
|
15
|
-
end
|
16
|
-
|
17
|
-
end
|
18
|
-
|
19
|
-
# Ensures that a session keys were set. If you want to check that a flash
|
20
|
-
# is not being set, please do:
|
21
|
-
#
|
22
|
-
# should_not_set_the_flash(:user)
|
23
|
-
#
|
24
|
-
# If you want to assure that a flash is being set to nil, do instead:
|
25
|
-
#
|
26
|
-
# should_set_the_flash(:user).to(nil)
|
27
|
-
#
|
28
|
-
# == Options
|
29
|
-
#
|
30
|
-
# * <tt>:to</tt> - The value to compare the flash key. It accepts procs and can also be given as a block (see examples below)
|
6
|
+
class SetTheFlashMatcher < SetSessionMatcher #:nodoc:
|
7
|
+
|
8
|
+
protected
|
9
|
+
def session
|
10
|
+
@subject ? (@subject.response.session['flash'] || {}) : {}
|
11
|
+
end
|
12
|
+
|
13
|
+
def interpolation_options
|
14
|
+
{ :flash_inspect => session.symbolize_keys!.inspect }
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
# Ensures that a session keys were set. If you want to check that a flash
|
20
|
+
# is not being set, please do:
|
21
|
+
#
|
22
|
+
# should_not_set_the_flash(:user)
|
23
|
+
#
|
24
|
+
# If you want to assure that a flash is being set to nil, do instead:
|
25
|
+
#
|
26
|
+
# should_set_the_flash(:user).to(nil)
|
27
|
+
#
|
28
|
+
# == Options
|
29
|
+
#
|
30
|
+
# * <tt>:to</tt> - The value to compare the flash key. It accepts procs and can also be given as a block (see examples below)
|
31
31
|
#
|
32
32
|
# == Examples
|
33
|
-
#
|
34
|
-
# should_set_the_flash
|
35
|
-
# should_not_set_the_flash
|
36
|
-
#
|
37
|
-
# should_set_the_flash :to => 'message'
|
38
|
-
# should_set_the_flash :notice, :warn
|
39
|
-
# should_set_the_flash :notice, :to => 'message'
|
40
|
-
# should_set_the_flash :notice, :to => proc{ 'hi ' + users(:first).name }
|
41
|
-
# should_set_the_flash(:notice){ 'hi ' + users(:first).name }
|
42
|
-
#
|
43
|
-
# it { should set_the_flash }
|
44
|
-
# it { should set_the_flash.to('message') }
|
45
|
-
# it { should set_the_flash(:notice, :warn) }
|
46
|
-
# it { should set_the_flash(:notice, :to => 'message') }
|
47
|
-
# it { should set_the_flash(:notice, :to => ('hi ' + users(:first).name)) }
|
48
|
-
#
|
49
|
-
def set_the_flash(*args, &block)
|
50
|
-
SetTheFlashMatcher.new(*args, &block).spec(self)
|
51
|
-
end
|
52
|
-
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
33
|
+
#
|
34
|
+
# should_set_the_flash
|
35
|
+
# should_not_set_the_flash
|
36
|
+
#
|
37
|
+
# should_set_the_flash :to => 'message'
|
38
|
+
# should_set_the_flash :notice, :warn
|
39
|
+
# should_set_the_flash :notice, :to => 'message'
|
40
|
+
# should_set_the_flash :notice, :to => proc{ 'hi ' + users(:first).name }
|
41
|
+
# should_set_the_flash(:notice){ 'hi ' + users(:first).name }
|
42
|
+
#
|
43
|
+
# it { should set_the_flash }
|
44
|
+
# it { should set_the_flash.to('message') }
|
45
|
+
# it { should set_the_flash(:notice, :warn) }
|
46
|
+
# it { should set_the_flash(:notice, :to => 'message') }
|
47
|
+
# it { should set_the_flash(:notice, :to => ('hi ' + users(:first).name)) }
|
48
|
+
#
|
49
|
+
def set_the_flash(*args, &block)
|
50
|
+
SetTheFlashMatcher.new(*args, &block).spec(self)
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -1,18 +1,18 @@
|
|
1
|
-
module Remarkable
|
2
|
-
module ActionView
|
3
|
-
end
|
4
|
-
end
|
5
|
-
|
6
|
-
dir = File.dirname(__FILE__)
|
7
|
-
require File.join(dir, 'action_view', 'base')
|
8
|
-
|
1
|
+
module Remarkable
|
2
|
+
module ActionView
|
3
|
+
end
|
4
|
+
end
|
5
|
+
|
6
|
+
dir = File.dirname(__FILE__)
|
7
|
+
require File.join(dir, 'action_view', 'base')
|
8
|
+
|
9
9
|
# Load matchers
|
10
|
-
Dir[File.join(dir, 'action_view', 'matchers', '*.rb')].each do |file|
|
10
|
+
Dir[File.join(dir, 'action_view', 'matchers', '*.rb')].each do |file|
|
11
11
|
require file
|
12
|
-
end
|
13
|
-
|
14
|
-
# Iinclude matchers in Spec::Rails
|
15
|
-
if defined?(Spec::Rails)
|
16
|
-
Remarkable.include_matchers!(Remarkable::ActionView, Spec::Rails::Example::FunctionalExampleGroup)
|
17
|
-
end
|
18
|
-
|
12
|
+
end
|
13
|
+
|
14
|
+
# Iinclude matchers in Spec::Rails
|
15
|
+
if defined?(Spec::Rails)
|
16
|
+
Remarkable.include_matchers!(Remarkable::ActionView, Spec::Rails::Example::FunctionalExampleGroup)
|
17
|
+
end
|
18
|
+
|
@@ -12,8 +12,8 @@ if defined?(ActiveRecord::Base)
|
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
15
|
-
# Include Remarkable ActiveRecord matcher in appropriate ExampleGroup
|
15
|
+
# Include Remarkable ActiveRecord matcher in appropriate ExampleGroup
|
16
16
|
if defined?(Spec::Rails)
|
17
|
-
Remarkable.include_matchers!(Remarkable::ActiveRecord, Spec::Rails::Example::ModelExampleGroup)
|
17
|
+
Remarkable.include_matchers!(Remarkable::ActiveRecord, Spec::Rails::Example::ModelExampleGroup)
|
18
18
|
end
|
19
19
|
end
|