rspec 1.0.5 → 1.0.6
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/CHANGES +78 -1
- data/EXAMPLES.rd +8 -5
- data/README +1 -0
- data/Rakefile +1 -1
- data/examples/pending_example.rb +20 -0
- data/lib/autotest/rspec.rb +46 -18
- data/lib/spec/dsl.rb +1 -0
- data/lib/spec/dsl/behaviour.rb +37 -27
- data/lib/spec/dsl/behaviour_callbacks.rb +4 -0
- data/lib/spec/dsl/behaviour_eval.rb +27 -16
- data/lib/spec/dsl/behaviour_factory.rb +2 -2
- data/lib/spec/dsl/composite_proc_builder.rb +9 -4
- data/lib/spec/dsl/configuration.rb +20 -4
- data/lib/spec/dsl/description.rb +7 -0
- data/lib/spec/dsl/errors.rb +9 -0
- data/lib/spec/dsl/example.rb +18 -10
- data/lib/spec/matchers/have.rb +10 -13
- data/lib/spec/matchers/operator_matcher.rb +3 -3
- data/lib/spec/matchers/raise_error.rb +8 -3
- data/lib/spec/mocks/error_generator.rb +1 -1
- data/lib/spec/mocks/message_expectation.rb +11 -0
- data/lib/spec/mocks/methods.rb +9 -5
- data/lib/spec/mocks/proxy.rb +13 -9
- data/lib/spec/rake/spectask.rb +80 -38
- data/lib/spec/runner/backtrace_tweaker.rb +2 -1
- data/lib/spec/runner/behaviour_runner.rb +37 -16
- data/lib/spec/runner/formatter/base_formatter.rb +23 -15
- data/lib/spec/runner/formatter/base_text_formatter.rb +39 -11
- data/lib/spec/runner/formatter/failing_behaviours_formatter.rb +7 -3
- data/lib/spec/runner/formatter/failing_examples_formatter.rb +3 -3
- data/lib/spec/runner/formatter/html_formatter.rb +32 -25
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +6 -5
- data/lib/spec/runner/formatter/rdoc_formatter.rb +6 -6
- data/lib/spec/runner/formatter/specdoc_formatter.rb +7 -6
- data/lib/spec/runner/option_parser.rb +6 -5
- data/lib/spec/runner/options.rb +60 -43
- data/lib/spec/runner/reporter.rb +17 -6
- data/lib/spec/runner/spec_parser.rb +1 -1
- data/lib/spec/translator.rb +8 -0
- data/lib/spec/version.rb +3 -3
- data/plugins/mock_frameworks/flexmock.rb +14 -18
- data/plugins/mock_frameworks/mocha.rb +0 -2
- data/plugins/mock_frameworks/rr.rb +21 -0
- data/spec/autotest/discover_spec.rb +19 -0
- data/spec/autotest/rspec_spec.rb +257 -0
- data/spec/autotest_helper.rb +4 -0
- data/spec/spec/dsl/behaviour_eval_spec.rb +30 -0
- data/spec/spec/dsl/behaviour_factory_spec.rb +18 -0
- data/spec/spec/dsl/behaviour_spec.rb +95 -58
- data/spec/spec/dsl/composite_proc_builder_spec.rb +0 -13
- data/spec/spec/dsl/configuration_spec.rb +6 -1
- data/spec/spec/dsl/description_spec.rb +9 -1
- data/spec/spec/dsl/example_class_spec.rb +3 -3
- data/spec/spec/dsl/example_instance_spec.rb +26 -28
- data/spec/spec/dsl/example_matcher_spec.rb +91 -0
- data/spec/spec/dsl/shared_behaviour_spec.rb +24 -0
- data/spec/spec/expectations/extensions/object_spec.rb +2 -2
- data/spec/spec/expectations/fail_with_spec.rb +2 -2
- data/spec/spec/matchers/have_spec.rb +1 -1
- data/spec/spec/matchers/operator_matcher_spec.rb +10 -10
- data/spec/spec/matchers/raise_error_spec.rb +38 -0
- data/spec/spec/mocks/argument_expectation_spec.rb +18 -14
- data/spec/spec/mocks/at_most_spec.rb +1 -1
- data/spec/spec/mocks/bug_report_11545_spec.rb +31 -0
- data/spec/spec/mocks/partial_mock_spec.rb +33 -1
- data/spec/spec/runner/behaviour_runner_spec.rb +72 -49
- data/spec/spec/runner/command_line_spec.rb +1 -1
- data/spec/spec/runner/context_matching_spec.rb +10 -10
- data/spec/spec/runner/drb_command_line_spec.rb +62 -59
- data/spec/spec/runner/extensions/bug_report_10577_spec.rb +35 -0
- data/spec/spec/runner/formatter/failing_behaviours_formatter_spec.rb +15 -2
- data/spec/spec/runner/formatter/failing_examples_formatter_spec.rb +3 -3
- data/spec/spec/runner/formatter/html_formatter_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_dry_run_spec.rb +14 -15
- data/spec/spec/runner/formatter/progress_bar_formatter_failure_dump_spec.rb +1 -1
- data/spec/spec/runner/formatter/progress_bar_formatter_spec.rb +42 -9
- data/spec/spec/runner/formatter/rdoc_formatter_spec.rb +40 -40
- data/spec/spec/runner/formatter/specdoc_formatter_spec.rb +55 -49
- data/spec/spec/runner/option_parser_spec.rb +16 -15
- data/spec/spec/runner/options_spec.rb +64 -31
- data/spec/spec/runner/reporter_spec.rb +67 -15
- data/spec/spec/spec_classes.rb +9 -1
- data/spec/spec/translator_spec.rb +48 -0
- data/spec/spec_helper.rb +5 -2
- metadata +13 -6
- data/examples/not_yet_implemented_spec.rb +0 -12
- data/spec/spec/runner/example_matcher_spec.rb +0 -127
@@ -6,17 +6,17 @@ module Spec
|
|
6
6
|
@output.puts "# #{name}"
|
7
7
|
end
|
8
8
|
|
9
|
-
def example_passed(
|
10
|
-
@output.puts "# * #{
|
9
|
+
def example_passed(example)
|
10
|
+
@output.puts "# * #{example.description}"
|
11
11
|
@output.flush
|
12
12
|
end
|
13
13
|
|
14
|
-
def example_failed(
|
15
|
-
@output.puts "# * #{
|
14
|
+
def example_failed(example, counter, failure)
|
15
|
+
@output.puts "# * #{example.description} [#{counter} - FAILED]"
|
16
16
|
end
|
17
17
|
|
18
|
-
def
|
19
|
-
@output.puts "# * #{
|
18
|
+
def example_pending(behaviour_name, example_name, message)
|
19
|
+
@output.puts "# * #{behaviour_name} #{example_name} [PENDING: #{message}]"
|
20
20
|
end
|
21
21
|
end
|
22
22
|
end
|
@@ -8,18 +8,19 @@ module Spec
|
|
8
8
|
@output.flush
|
9
9
|
end
|
10
10
|
|
11
|
-
def example_failed(
|
12
|
-
@output.puts failure.expectation_not_met? ? red("- #{
|
11
|
+
def example_failed(example, counter, failure)
|
12
|
+
@output.puts failure.expectation_not_met? ? red("- #{example.description} (FAILED - #{counter})") : magenta("- #{example.description} (ERROR - #{counter})")
|
13
13
|
@output.flush
|
14
14
|
end
|
15
15
|
|
16
|
-
def example_passed(
|
17
|
-
@output.puts green("- #{
|
16
|
+
def example_passed(example)
|
17
|
+
@output.puts green("- #{example.description}")
|
18
18
|
@output.flush
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
|
21
|
+
def example_pending(behaviour_name, example_name, message)
|
22
|
+
super
|
23
|
+
@output.puts yellow("- #{example_name} (PENDING: #{message})")
|
23
24
|
@output.flush
|
24
25
|
end
|
25
26
|
end
|
@@ -89,13 +89,14 @@ module Spec
|
|
89
89
|
# Some exit points in parse (--generate-options, --drb) don't return the options,
|
90
90
|
# but hand over control. In that case we don't want to continue.
|
91
91
|
return nil unless options.is_a?(Options)
|
92
|
-
options.
|
92
|
+
options.configure
|
93
|
+
options.behaviour_runner
|
93
94
|
end
|
94
95
|
|
95
96
|
def parse(args, err, out, warn_if_no_files)
|
96
97
|
options_file = nil
|
97
98
|
args_copy = args.dup
|
98
|
-
options = Options.new
|
99
|
+
options = Options.new(err, out)
|
99
100
|
|
100
101
|
opts = ::OptionParser.new do |opts|
|
101
102
|
opts.banner = "Usage: spec (FILE|DIRECTORY|GLOB)+ [options]"
|
@@ -105,7 +106,7 @@ module Spec
|
|
105
106
|
on(*COMMAND_LINE[name], &block)
|
106
107
|
end
|
107
108
|
|
108
|
-
opts.rspec_on(:diff) {|diff| options.parse_diff(diff
|
109
|
+
opts.rspec_on(:diff) {|diff| options.parse_diff(diff)}
|
109
110
|
|
110
111
|
opts.rspec_on(:colour) {options.colour = true}
|
111
112
|
|
@@ -115,7 +116,7 @@ module Spec
|
|
115
116
|
|
116
117
|
opts.rspec_on(:line) {|line_number| options.line_number = line_number.to_i}
|
117
118
|
|
118
|
-
opts.rspec_on(:format) {|format| options.parse_format(format
|
119
|
+
opts.rspec_on(:format) {|format| options.parse_format(format)}
|
119
120
|
|
120
121
|
opts.rspec_on(:require) {|req| options.parse_require(req)}
|
121
122
|
|
@@ -140,7 +141,7 @@ module Spec
|
|
140
141
|
end
|
141
142
|
|
142
143
|
opts.rspec_on(:runner) do |runner|
|
143
|
-
options.
|
144
|
+
options.runner_arg = runner
|
144
145
|
end
|
145
146
|
|
146
147
|
opts.rspec_on(:drb) do
|
data/lib/spec/runner/options.rb
CHANGED
@@ -32,12 +32,14 @@ module Spec
|
|
32
32
|
:loadby,
|
33
33
|
:reporter,
|
34
34
|
:reverse,
|
35
|
-
:runner_type,
|
36
35
|
:timeout,
|
37
|
-
:verbose
|
36
|
+
:verbose,
|
37
|
+
:runner_arg,
|
38
|
+
:behaviour_runner
|
38
39
|
)
|
39
40
|
|
40
|
-
def initialize
|
41
|
+
def initialize(err, out)
|
42
|
+
@err, @out = err, out
|
41
43
|
@backtrace_tweaker = QuietBacktraceTweaker.new
|
42
44
|
@examples = []
|
43
45
|
@formatters = []
|
@@ -45,29 +47,42 @@ module Spec
|
|
45
47
|
@dry_run = false
|
46
48
|
end
|
47
49
|
|
50
|
+
def configure
|
51
|
+
configure_formatters
|
52
|
+
create_reporter
|
53
|
+
configure_differ
|
54
|
+
create_behaviour_runner
|
55
|
+
end
|
56
|
+
|
48
57
|
def create_behaviour_runner
|
58
|
+
return nil if @generate
|
59
|
+
@behaviour_runner = if @runner_arg
|
60
|
+
klass_name, arg = split_at_colon(@runner_arg)
|
61
|
+
runner_type = load_class(klass_name, 'behaviour runner', '--runner')
|
62
|
+
runner_type.new(self, arg)
|
63
|
+
else
|
64
|
+
BehaviourRunner.new(self)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def configure_formatters
|
49
69
|
@formatters.each do |formatter|
|
50
70
|
formatter.colour = @colour if formatter.respond_to?(:colour=)
|
51
71
|
formatter.dry_run = @dry_run if formatter.respond_to?(:dry_run=)
|
52
72
|
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def create_reporter
|
53
76
|
@reporter = Reporter.new(@formatters, @backtrace_tweaker)
|
77
|
+
end
|
54
78
|
|
55
|
-
|
56
|
-
# it should, but the way things are coupled, it doesn't
|
79
|
+
def configure_differ
|
57
80
|
if @differ_class
|
58
81
|
Spec::Expectations.differ = @differ_class.new(@diff_format, @context_lines, @colour)
|
59
82
|
end
|
60
|
-
|
61
|
-
return nil if @generate
|
62
|
-
|
63
|
-
if @runner_type
|
64
|
-
@runner_type.new(self)
|
65
|
-
else
|
66
|
-
BehaviourRunner.new(self)
|
67
|
-
end
|
68
83
|
end
|
69
84
|
|
70
|
-
def parse_diff(format
|
85
|
+
def parse_diff(format)
|
71
86
|
@context_lines = 3
|
72
87
|
case format
|
73
88
|
when :context, 'context', 'c'
|
@@ -80,14 +95,8 @@ module Spec
|
|
80
95
|
require 'spec/expectations/differs/default'
|
81
96
|
@differ_class = Spec::Expectations::Differs::Default
|
82
97
|
else
|
83
|
-
|
84
|
-
|
85
|
-
@differ_class = eval(format)
|
86
|
-
rescue NameError
|
87
|
-
error_stream.puts "Couldn't find differ class #{format}"
|
88
|
-
error_stream.puts "Make sure the --require option is specified *before* --diff"
|
89
|
-
exit if out_stream == $stdout
|
90
|
-
end
|
98
|
+
@diff_format = :custom
|
99
|
+
@differ_class = load_class(format, 'differ', '--diff')
|
91
100
|
end
|
92
101
|
end
|
93
102
|
|
@@ -99,25 +108,17 @@ module Spec
|
|
99
108
|
end
|
100
109
|
end
|
101
110
|
|
102
|
-
def parse_format(
|
103
|
-
where =
|
111
|
+
def parse_format(format_arg)
|
112
|
+
format, where = split_at_colon(format_arg)
|
104
113
|
# This funky regexp checks whether we have a FILE_NAME or not
|
105
|
-
if
|
106
|
-
format = $1
|
107
|
-
where = $2
|
108
|
-
else
|
114
|
+
if where.nil?
|
109
115
|
raise "When using several --format options only one of them can be without a file" if @out_used
|
116
|
+
where = @out
|
110
117
|
@out_used = true
|
111
118
|
end
|
112
119
|
|
113
|
-
|
114
|
-
|
115
|
-
@formatters << formatter_type.new(where)
|
116
|
-
rescue NameError
|
117
|
-
error_stream.puts "Couldn't find formatter class #{format}"
|
118
|
-
error_stream.puts "Make sure the --require option is specified *before* --format"
|
119
|
-
exit if out_stream == $stdout
|
120
|
-
end
|
120
|
+
formatter_type = BUILT_IN_FORMATTERS[format] || load_class(format, 'formatter', '--format')
|
121
|
+
@formatters << formatter_type.new(where)
|
121
122
|
end
|
122
123
|
|
123
124
|
def parse_require(req)
|
@@ -135,7 +136,6 @@ module Spec
|
|
135
136
|
index = args_copy.index("-G") || args_copy.index("--generate-options")
|
136
137
|
args_copy.delete_at(index)
|
137
138
|
args_copy.delete_at(index)
|
138
|
-
|
139
139
|
File.open(options_file, 'w') do |io|
|
140
140
|
io.puts args_copy.join("\n")
|
141
141
|
end
|
@@ -144,13 +144,30 @@ module Spec
|
|
144
144
|
@generate = true
|
145
145
|
end
|
146
146
|
|
147
|
-
def
|
147
|
+
def split_at_colon(s)
|
148
|
+
if s =~ /([a-zA-Z_]+(?:::[a-zA-Z_]+)*):?(.*)/
|
149
|
+
arg = $2 == "" ? nil : $2
|
150
|
+
[$1, arg]
|
151
|
+
else
|
152
|
+
raise "Couldn't parse #{s.inspect}"
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def load_class(name, kind, option)
|
157
|
+
if name =~ /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/
|
158
|
+
arg = $2 == "" ? nil : $2
|
159
|
+
[$1, arg]
|
160
|
+
else
|
161
|
+
m = "#{name.inspect} is not a valid class name"
|
162
|
+
@err.puts m
|
163
|
+
raise m
|
164
|
+
end
|
148
165
|
begin
|
149
|
-
|
150
|
-
rescue NameError
|
151
|
-
|
152
|
-
|
153
|
-
|
166
|
+
eval(name, binding, __FILE__, __LINE__)
|
167
|
+
rescue NameError => e
|
168
|
+
@err.puts "Couldn't find #{kind} class #{name}"
|
169
|
+
@err.puts "Make sure the --require option is specified *before* #{option}"
|
170
|
+
if $_spec_spec ; raise e ; else exit(1) ; end
|
154
171
|
end
|
155
172
|
end
|
156
173
|
end
|
data/lib/spec/runner/reporter.rb
CHANGED
@@ -21,9 +21,11 @@ module Spec
|
|
21
21
|
@example_names << name
|
22
22
|
|
23
23
|
if not_implemented
|
24
|
-
|
24
|
+
example_pending(@behaviour_names.last, name)
|
25
25
|
elsif error.nil?
|
26
26
|
example_passed(name)
|
27
|
+
elsif Spec::DSL::ExamplePendingError === error
|
28
|
+
example_pending(@behaviour_names.last, name, error.message)
|
27
29
|
else
|
28
30
|
example_failed(name, error, failure_location)
|
29
31
|
end
|
@@ -43,7 +45,10 @@ module Spec
|
|
43
45
|
def dump
|
44
46
|
@formatters.each{|f| f.start_dump}
|
45
47
|
dump_failures
|
46
|
-
@formatters.each
|
48
|
+
@formatters.each do |f|
|
49
|
+
f.dump_summary(duration, @example_names.length, @failures.length, @pending_count)
|
50
|
+
f.close
|
51
|
+
end
|
47
52
|
@failures.length
|
48
53
|
end
|
49
54
|
|
@@ -52,7 +57,7 @@ module Spec
|
|
52
57
|
def clear!
|
53
58
|
@behaviour_names = []
|
54
59
|
@failures = []
|
55
|
-
@
|
60
|
+
@pending_count = 0
|
56
61
|
@example_names = []
|
57
62
|
@start_time = nil
|
58
63
|
@end_time = nil
|
@@ -83,9 +88,9 @@ module Spec
|
|
83
88
|
@formatters.each{|f| f.example_failed(name, @failures.length, failure)}
|
84
89
|
end
|
85
90
|
|
86
|
-
def
|
87
|
-
@
|
88
|
-
@formatters.each{|f| f.
|
91
|
+
def example_pending(behaviour_name, example_name, message="Not Yet Implemented")
|
92
|
+
@pending_count += 1
|
93
|
+
@formatters.each{|f| f.example_pending(behaviour_name, example_name, message)}
|
89
94
|
end
|
90
95
|
|
91
96
|
class Failure
|
@@ -99,11 +104,17 @@ module Spec
|
|
99
104
|
def header
|
100
105
|
if expectation_not_met?
|
101
106
|
"'#{@example_name}' FAILED"
|
107
|
+
elsif pending_fixed?
|
108
|
+
"'#{@example_name}' FIXED"
|
102
109
|
else
|
103
110
|
"#{@exception.class.name} in '#{@example_name}'"
|
104
111
|
end
|
105
112
|
end
|
106
113
|
|
114
|
+
def pending_fixed?
|
115
|
+
@exception.is_a?(Spec::DSL::PendingFixedError)
|
116
|
+
end
|
117
|
+
|
107
118
|
def expectation_not_met?
|
108
119
|
@exception.is_a?(Spec::Expectations::ExpectationNotMetError)
|
109
120
|
end
|
data/lib/spec/translator.rb
CHANGED
@@ -34,6 +34,14 @@ module Spec
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def translate_line(line)
|
37
|
+
# Translate deprecated mock constraints
|
38
|
+
line.gsub!(/:any_args/, 'any_args')
|
39
|
+
line.gsub!(/:anything/, 'anything')
|
40
|
+
line.gsub!(/:boolean/, 'boolean')
|
41
|
+
line.gsub!(/:no_args/, 'no_args')
|
42
|
+
line.gsub!(/:numeric/, 'an_instance_of(Numeric)')
|
43
|
+
line.gsub!(/:string/, 'an_instance_of(String)')
|
44
|
+
|
37
45
|
return line if line =~ /(should_not|should)_receive/
|
38
46
|
|
39
47
|
line.gsub!(/(^\s*)context([\s*|\(]['|"|A-Z])/, '\1describe\2')
|
data/lib/spec/version.rb
CHANGED
@@ -3,11 +3,11 @@ module Spec
|
|
3
3
|
unless defined? MAJOR
|
4
4
|
MAJOR = 1
|
5
5
|
MINOR = 0
|
6
|
-
TINY =
|
6
|
+
TINY = 6
|
7
7
|
RELEASE_CANDIDATE = nil
|
8
8
|
|
9
|
-
# RANDOM_TOKEN: 0.
|
10
|
-
REV = "$LastChangedRevision:
|
9
|
+
# RANDOM_TOKEN: 0.450848541683348
|
10
|
+
REV = "$LastChangedRevision: 2326 $".match(/LastChangedRevision: (\d+)/)[1]
|
11
11
|
|
12
12
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
13
13
|
TAG = "REL_#{[MAJOR, MINOR, TINY, RELEASE_CANDIDATE].compact.join('_')}".upcase.gsub(/\.|-/, '_')
|
@@ -3,25 +3,21 @@
|
|
3
3
|
# Created by Jim Weirich on 2007-04-10.
|
4
4
|
# Copyright (c) 2007. All rights reserved.
|
5
5
|
|
6
|
-
begin
|
7
|
-
require 'rubygems'
|
8
|
-
rescue LoadError => ex
|
9
|
-
end
|
10
6
|
require 'flexmock/rspec'
|
11
7
|
|
12
8
|
module Spec
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
9
|
+
module Plugins
|
10
|
+
module MockFramework
|
11
|
+
include FlexMock::MockContainer
|
12
|
+
def setup_mocks_for_rspec
|
13
|
+
# No setup required
|
14
|
+
end
|
15
|
+
def verify_mocks_for_rspec
|
16
|
+
flexmock_verify
|
17
|
+
end
|
18
|
+
def teardown_mocks_for_rspec
|
19
|
+
flexmock_close
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
27
23
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'rr'
|
2
|
+
|
3
|
+
patterns = ::Spec::Runner::QuietBacktraceTweaker::IGNORE_PATTERNS
|
4
|
+
patterns.push(RR::Errors::BACKTRACE_IDENTIFIER)
|
5
|
+
|
6
|
+
module Spec
|
7
|
+
module Plugins
|
8
|
+
module MockFramework
|
9
|
+
include RR::Extensions::InstanceMethods
|
10
|
+
def setup_mocks_for_rspec
|
11
|
+
RR::Space.instance.reset
|
12
|
+
end
|
13
|
+
def verify_mocks_for_rspec
|
14
|
+
RR::Space.instance.verify_doubles
|
15
|
+
end
|
16
|
+
def teardown_mocks_for_rspec
|
17
|
+
RR::Space.instance.reset
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + "/../autotest_helper"
|
2
|
+
|
3
|
+
module DiscoveryHelper
|
4
|
+
def load_discovery
|
5
|
+
require File.dirname(__FILE__) + "/../../lib/autotest/discover"
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
|
10
|
+
class Autotest
|
11
|
+
describe Rspec, "discovery" do
|
12
|
+
include DiscoveryHelper
|
13
|
+
|
14
|
+
it "should add the rspec autotest plugin" do
|
15
|
+
Autotest.should_receive(:add_discovery).and_yield
|
16
|
+
load_discovery
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|