rspec 0.7.0 → 0.7.1
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGES +27 -9
- data/Rakefile +8 -3
- data/bin/spec +1 -15
- data/lib/spec.rb +1 -1
- data/lib/spec/mocks/errors.rb +2 -2
- data/lib/spec/mocks/mock.rb +11 -0
- data/lib/spec/mocks/mock_handler.rb +30 -36
- data/lib/spec/mocks/mock_methods.rb +2 -6
- data/lib/spec/runner.rb +1 -0
- data/lib/spec/runner/backtrace_tweaker.rb +9 -8
- data/lib/spec/runner/command_line.rb +31 -0
- data/lib/spec/runner/context_runner.rb +1 -3
- data/lib/spec/runner/extensions/kernel.rb +2 -3
- data/lib/spec/runner/formatter/base_text_formatter.rb +8 -2
- data/lib/spec/runner/formatter/html_formatter.rb +34 -25
- data/lib/spec/runner/formatter/progress_bar_formatter.rb +1 -1
- data/lib/spec/runner/formatter/specdoc_formatter.rb +1 -1
- data/lib/spec/runner/option_parser.rb +7 -7
- data/lib/spec/runner/reporter.rb +9 -1
- data/lib/spec/version.rb +3 -3
- data/vendor/selenium/start_browser_once.patch +65 -0
- metadata +9 -5
- data/lib/spec/callback.rb +0 -0
data/CHANGES
CHANGED
@@ -1,6 +1,25 @@
|
|
1
1
|
= RSpec Changelog
|
2
2
|
|
3
|
-
== Version 0.7.
|
3
|
+
== Version 0.7.1
|
4
|
+
|
5
|
+
Bug fixes and a couple o' new features.
|
6
|
+
|
7
|
+
* Fixed [#6575] Parse error in aliasing the partial mock original method (patch by Brian Takita)
|
8
|
+
* Fixed [#6277] debris left by stubbing (trunk) [submitted by dastels] (fixed by fix to [#6575])
|
9
|
+
* Fixed [#6575] Parse error in aliasing the partial mock original method
|
10
|
+
* Fixed [#6555] should_have_tag does not match documentation
|
11
|
+
* Fixed [#6567] SyntaxError should not stop entire run
|
12
|
+
* Fixed [#6558] integrated views look for template even when redirected
|
13
|
+
* Fixed [#6547] response.should_be_redirect broken in 0.7.0
|
14
|
+
* Applied [#6471] Easy way to spec routes
|
15
|
+
* Applied [#6587] Rspec on Rails displays "Spec::Rails::ContextFactory" as context name
|
16
|
+
* Applied [#6514] Document has trivial typos.
|
17
|
+
* Added [#6560] controller.session should be available before the action
|
18
|
+
* Added support for should_have_rjs :visual_effect
|
19
|
+
* Different printing and colours for unmet expectations (red) and other exceptions (magenta)
|
20
|
+
* Simplified method_missing on mock_methods to make it less invasive on partial mocks.
|
21
|
+
|
22
|
+
== Version 0.7.0
|
4
23
|
|
5
24
|
This is the "Grow up and eat your own dog food release". RSpec is now used on itself and
|
6
25
|
we're no longer using Test::Unit to test it. Although, we are still extending Test::Unit
|
@@ -10,7 +29,6 @@ IMPORTANT NOTE: THIS RELEASE IS NOT 100% BACKWARDS COMPATIBLE TO 0.6.x
|
|
10
29
|
|
11
30
|
There are a few changes that will require that you change your existing specs.
|
12
31
|
|
13
|
-
--------------------------------------------------
|
14
32
|
RSpec now handles equality exactly like ruby does:
|
15
33
|
|
16
34
|
# actual.should_equal(expected) will pass if actual.equal?(expected) returns true
|
@@ -35,8 +53,8 @@ used to pass for any non-nil, non-false value), and actual.should_be false will
|
|
35
53
|
value other than false (it used to pass for nil or false).
|
36
54
|
|
37
55
|
Here's what you'll need to do to update your specs:
|
38
|
-
|
39
|
-
|
56
|
+
# search for "should_equal" and replace with "should_eql"
|
57
|
+
# run specs
|
40
58
|
|
41
59
|
If any specs still fail, they are probably related to should_be(true) or should_be(false) using
|
42
60
|
non-boolean values. Those you'll just have to inspect manually and adjust appropriately (sorry!).
|
@@ -53,15 +71,15 @@ mock.should_receive(:message).and_return([1,2,3])
|
|
53
71
|
but we decided that was counter intuitive and otherwise lame.
|
54
72
|
|
55
73
|
Here's what you'll need to do to update your specs:
|
56
|
-
|
57
|
-
|
74
|
+
# search for "and_return(["
|
75
|
+
# get rid of the "[" and "]"
|
58
76
|
|
59
77
|
--------------------------------------------------
|
60
78
|
RSpec on Rails now supports the following (thanks to ZenTest upon which it is built):
|
61
79
|
|
62
|
-
|
63
|
-
|
64
|
-
|
80
|
+
# Separate specs for models, views, controllers and helpers
|
81
|
+
# Controller specs are completely decoupled from the views by default (though you can tell them to couple themselves if you prefer)
|
82
|
+
# View specs are completely decoupled from app-specific controllers
|
65
83
|
|
66
84
|
See http://rspec.rubyforge.org/documentation/rails/index.html for more information
|
67
85
|
--------------------------------------------------
|
data/Rakefile
CHANGED
@@ -24,6 +24,7 @@ PKG_FILES = FileList[
|
|
24
24
|
'vendor/watir/*.rb',
|
25
25
|
'vendor/watir/*.txt',
|
26
26
|
'vendor/selenium/*.rb',
|
27
|
+
'vendor/selenium/*.patch',
|
27
28
|
'vendor/selenium/*.txt'
|
28
29
|
]
|
29
30
|
|
@@ -35,7 +36,7 @@ Spec::Rake::SpecTask.new do |t|
|
|
35
36
|
t.spec_opts = ['--diff','--color','--backtrace']
|
36
37
|
t.rcov = true
|
37
38
|
t.rcov_dir = 'doc/output/coverage'
|
38
|
-
t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec']
|
39
|
+
t.rcov_opts = ['--exclude', 'spec\/spec,bin\/spec,examples']
|
39
40
|
end
|
40
41
|
|
41
42
|
desc "Run all failing examples"
|
@@ -188,8 +189,12 @@ task :pre_commit => [
|
|
188
189
|
|
189
190
|
task :rails_pre_commit do
|
190
191
|
Dir.chdir 'vendor/rspec_on_rails' do
|
191
|
-
|
192
|
-
|
192
|
+
IO.popen("rake pre_commit --verbose") do |io|
|
193
|
+
io.each do |line|
|
194
|
+
puts line
|
195
|
+
end
|
196
|
+
end
|
197
|
+
raise "RSpec on Rails pre_commit failed" if $? != 0
|
193
198
|
end
|
194
199
|
end
|
195
200
|
|
data/bin/spec
CHANGED
@@ -1,19 +1,5 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
$LOAD_PATH.push File.dirname(__FILE__) + "/../lib"
|
3
3
|
require File.expand_path(File.dirname(__FILE__) + "/../lib/spec") # better stack traces this way
|
4
|
-
|
5
|
-
$context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV, false, STDERR, STDOUT)
|
6
|
-
|
7
|
-
# If ARGV is a glob, it will actually each over each one of the matching files.
|
8
|
-
ARGV.each do |file_or_dir|
|
9
|
-
if File.directory?(file_or_dir)
|
10
|
-
Dir["#{file_or_dir}/**/*.rb"].each do |file|
|
11
|
-
require file
|
12
|
-
end
|
13
|
-
else
|
14
|
-
require file_or_dir
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
$context_runner.run(true)
|
4
|
+
::Spec::Runner::CommandLine.run(ARGV, STDERR, STDOUT, true, true)
|
19
5
|
|
data/lib/spec.rb
CHANGED
data/lib/spec/mocks/errors.rb
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
module Spec
|
2
2
|
module Mocks
|
3
|
-
class MockExpectationError <
|
3
|
+
class MockExpectationError < Expectations::ExpectationNotMetError
|
4
4
|
end
|
5
5
|
|
6
|
-
class AmbiguousReturnError <
|
6
|
+
class AmbiguousReturnError < Expectations::ExpectationNotMetError
|
7
7
|
end
|
8
8
|
end
|
9
9
|
end
|
data/lib/spec/mocks/mock.rb
CHANGED
@@ -10,6 +10,17 @@ module Spec
|
|
10
10
|
@name = name
|
11
11
|
@options = options
|
12
12
|
end
|
13
|
+
|
14
|
+
def method_missing(sym, *args, &block)
|
15
|
+
__mock_handler.instance_eval {@messages_received << [sym, args, block]}
|
16
|
+
begin
|
17
|
+
return self if __mock_handler.null_object?
|
18
|
+
super(sym, *args, &block)
|
19
|
+
rescue NoMethodError
|
20
|
+
__mock_handler.raise_unexpected_message_error sym, *args
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
13
24
|
end
|
14
25
|
end
|
15
26
|
end
|
@@ -9,7 +9,7 @@ module Spec
|
|
9
9
|
@expectations = []
|
10
10
|
@messages_received = []
|
11
11
|
@stubs = []
|
12
|
-
@proxied_methods =
|
12
|
+
@proxied_methods = {}
|
13
13
|
@options = options ? DEFAULT_OPTIONS.dup.merge(options) : DEFAULT_OPTIONS
|
14
14
|
end
|
15
15
|
|
@@ -17,44 +17,41 @@ module Spec
|
|
17
17
|
:null_object => false,
|
18
18
|
:auto_verify => true
|
19
19
|
}
|
20
|
-
|
20
|
+
|
21
21
|
def null_object?
|
22
22
|
@options[:null_object]
|
23
23
|
end
|
24
|
-
|
24
|
+
|
25
25
|
def add_message_expectation(expected_from, sym, opts={}, &block)
|
26
26
|
__add expected_from, sym, block
|
27
27
|
@expectations << MessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil, 1, opts)
|
28
28
|
@expectations.last
|
29
29
|
end
|
30
|
-
|
30
|
+
|
31
31
|
def add_negative_message_expectation(expected_from, sym, &block)
|
32
32
|
__add expected_from, sym, block
|
33
33
|
@expectations << NegativeMessageExpectation.new(@error_generator, @expectation_ordering, expected_from, sym, block_given? ? block : nil)
|
34
34
|
@expectations.last
|
35
35
|
end
|
36
|
-
|
36
|
+
|
37
37
|
def add_stub(expected_from, sym)
|
38
38
|
__add expected_from, sym, nil
|
39
39
|
@stubs << MethodStub.new(@error_generator, @expectation_ordering, expected_from, sym, nil)
|
40
40
|
@stubs.last
|
41
41
|
end
|
42
|
-
|
42
|
+
|
43
43
|
def __add expected_from, sym, block
|
44
44
|
Runner::Specification.add_listener(self) if @options[:auto_verify]
|
45
45
|
define_expected_method(sym)
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def spec_finished spec
|
49
49
|
verify
|
50
50
|
end
|
51
51
|
|
52
52
|
def define_expected_method(sym)
|
53
|
-
if @target.respond_to? sym
|
54
|
-
|
55
|
-
alias_method :#{__pre_proxied_method_name(sym)}, :#{sym}
|
56
|
-
-
|
57
|
-
@proxied_methods << sym
|
53
|
+
if @target.respond_to?(sym) && !@proxied_methods[sym]
|
54
|
+
@proxied_methods[sym] = @target.method(sym)
|
58
55
|
end
|
59
56
|
|
60
57
|
metaclass_eval %-
|
@@ -64,10 +61,6 @@ module Spec
|
|
64
61
|
-
|
65
62
|
end
|
66
63
|
|
67
|
-
def __pre_proxied_method_name method_name
|
68
|
-
"original_#{method_name.to_s.delete('!').delete('[').delete('\]')}_before_proxy"
|
69
|
-
end
|
70
|
-
|
71
64
|
def verify #:nodoc:
|
72
65
|
begin
|
73
66
|
verify_expectations
|
@@ -75,14 +68,14 @@ module Spec
|
|
75
68
|
reset
|
76
69
|
end
|
77
70
|
end
|
78
|
-
|
71
|
+
|
79
72
|
def reset
|
80
73
|
clear_expectations
|
81
74
|
clear_stubs
|
82
75
|
reset_proxied_methods
|
83
76
|
clear_proxied_methods
|
84
77
|
end
|
85
|
-
|
78
|
+
|
86
79
|
def verify_expectations
|
87
80
|
@expectations.each do |expectation|
|
88
81
|
expectation.verify_messages_received
|
@@ -90,24 +83,25 @@ module Spec
|
|
90
83
|
end
|
91
84
|
|
92
85
|
def reset_proxied_methods
|
93
|
-
@proxied_methods.each do |method_name|
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
86
|
+
@proxied_methods.each do |method_name, method_obj|
|
87
|
+
define_instance_method(method_name, method_obj)
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def define_instance_method(method_name, method_obj)
|
92
|
+
(class << @target; self; end).class_eval do
|
93
|
+
define_method method_name, &method_obj
|
94
|
+
end
|
95
|
+
end
|
102
96
|
|
103
97
|
def clear_expectations #:nodoc:
|
104
98
|
@expectations.clear
|
105
99
|
end
|
106
|
-
|
100
|
+
|
107
101
|
def clear_stubs #:nodoc:
|
108
102
|
@stubs.clear
|
109
103
|
end
|
110
|
-
|
104
|
+
|
111
105
|
def clear_proxied_methods #:nodoc:
|
112
106
|
@proxied_methods.clear
|
113
107
|
end
|
@@ -115,7 +109,7 @@ module Spec
|
|
115
109
|
def metaclass_eval str
|
116
110
|
(class << @target; self; end).class_eval str
|
117
111
|
end
|
118
|
-
|
112
|
+
|
119
113
|
def received_message?(sym, *args, &block)
|
120
114
|
return true if @messages_received.find {|array| array == [sym, args, block]}
|
121
115
|
return false
|
@@ -124,19 +118,19 @@ module Spec
|
|
124
118
|
def find_matching_expectation(sym, *args)
|
125
119
|
@expectations.find {|expectation| expectation.matches(sym, args)}
|
126
120
|
end
|
127
|
-
|
121
|
+
|
128
122
|
def find_almost_matching_expectation(sym, *args)
|
129
123
|
@expectations.find {|expectation| expectation.matches_name_but_not_args(sym, args)}
|
130
124
|
end
|
131
|
-
|
125
|
+
|
132
126
|
def find_matching_method_stub(sym)
|
133
127
|
@stubs.find {|stub| stub.matches(sym, [])}
|
134
128
|
end
|
135
|
-
|
129
|
+
|
136
130
|
def has_negative_expectation?(sym)
|
137
131
|
@expectations.detect {|expectation| expectation.negative_expectation_for?(sym)}
|
138
132
|
end
|
139
|
-
|
133
|
+
|
140
134
|
def message_received(sym, *args, &block)
|
141
135
|
if expectation = find_matching_expectation(sym, *args)
|
142
136
|
expectation.invoke(args, block)
|
@@ -148,11 +142,11 @@ module Spec
|
|
148
142
|
@target.send :method_missing, sym, *args, &block
|
149
143
|
end
|
150
144
|
end
|
151
|
-
|
145
|
+
|
152
146
|
def raise_unexpected_message_error sym, *args
|
153
147
|
@error_generator.raise_unexpected_message_error sym, *args
|
154
148
|
end
|
155
|
-
|
149
|
+
|
156
150
|
end
|
157
151
|
end
|
158
152
|
end
|
@@ -27,15 +27,11 @@ module Spec
|
|
27
27
|
|
28
28
|
def method_missing(sym, *args, &block)
|
29
29
|
__mock_handler.instance_eval {@messages_received << [sym, args, block]}
|
30
|
-
|
31
|
-
return self if __mock_handler.null_object?
|
32
|
-
super(sym, *args, &block)
|
33
|
-
rescue NoMethodError
|
34
|
-
__mock_handler.raise_unexpected_message_error sym, *args
|
35
|
-
end
|
30
|
+
super(sym, *args, &block)
|
36
31
|
end
|
37
32
|
|
38
33
|
private
|
34
|
+
|
39
35
|
def __mock_handler
|
40
36
|
@mock_handler ||= MockHandler.new(self, @name, @options)
|
41
37
|
end
|
data/lib/spec/runner.rb
CHANGED
@@ -5,6 +5,7 @@ require 'spec/runner/specification'
|
|
5
5
|
require 'spec/runner/execution_context'
|
6
6
|
require 'spec/runner/context_runner'
|
7
7
|
require 'spec/runner/option_parser'
|
8
|
+
require 'spec/runner/command_line'
|
8
9
|
require 'spec/runner/backtrace_tweaker'
|
9
10
|
require 'spec/runner/reporter'
|
10
11
|
require 'spec/runner/spec_matcher'
|
@@ -1,13 +1,10 @@
|
|
1
1
|
module Spec
|
2
2
|
module Runner
|
3
|
-
class
|
3
|
+
class NoisyBacktraceTweaker
|
4
4
|
def tweak_instance_exec_line line, spec_name
|
5
5
|
line = line.split(':in')[0] + ":in `#{spec_name}'" if line.include?('__instance_exec')
|
6
6
|
line
|
7
7
|
end
|
8
|
-
end
|
9
|
-
|
10
|
-
class NoisyBacktraceTweaker < BacktraceTweaker
|
11
8
|
def tweak_backtrace(error, spec_name)
|
12
9
|
return if error.backtrace.nil?
|
13
10
|
error.backtrace.collect! do |line|
|
@@ -18,24 +15,28 @@ module Spec
|
|
18
15
|
end
|
19
16
|
|
20
17
|
# Tweaks raised Exceptions to mask noisy (unneeded) parts of the backtrace
|
21
|
-
class QuietBacktraceTweaker
|
18
|
+
class QuietBacktraceTweaker
|
19
|
+
def tweak_instance_exec_line line, spec_name
|
20
|
+
line = line.split(':in')[0] if line.include?('__instance_exec')
|
21
|
+
line
|
22
|
+
end
|
22
23
|
def tweak_backtrace(error, spec_name)
|
23
24
|
return if error.backtrace.nil?
|
24
25
|
error.backtrace.collect! do |line|
|
25
26
|
line = tweak_instance_exec_line line, spec_name
|
26
27
|
line = nil if line =~ /\/lib\/ruby\//
|
27
28
|
line = nil if line =~ /\/lib\/spec\/expectations\//
|
28
|
-
line = nil if line =~ /\/lib\/spec\/method_proxy\//
|
29
29
|
line = nil if line =~ /\/lib\/spec\/mocks\//
|
30
30
|
line = nil if line =~ /\/lib\/spec\/rake\//
|
31
31
|
line = nil if line =~ /\/lib\/spec\/runner\//
|
32
|
-
line = nil if line =~ /\/lib\/spec\/stubs\//
|
33
32
|
line = nil if line =~ /bin\/spec:/
|
34
33
|
line = nil if line =~ /bin\/rcov:/
|
35
34
|
line = nil if line =~ /lib\/rspec_on_rails/
|
36
35
|
line = nil if line =~ /script\/rails_spec/
|
37
|
-
# TextMate's Ruby
|
36
|
+
# TextMate's Ruby and RSpec plugins
|
38
37
|
line = nil if line =~ /Ruby\.tmbundle\/Support\/tmruby.rb:/
|
38
|
+
line = nil if line =~ /RSpec\.tmbundle\/Support\/lib/
|
39
|
+
line = nil if line =~ /temp_textmate\./
|
39
40
|
line
|
40
41
|
end
|
41
42
|
error.backtrace.compact!
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Spec
|
2
|
+
module Runner
|
3
|
+
# Facade to run specs without having to fork a new ruby process (using `spec ...`)
|
4
|
+
class CommandLine
|
5
|
+
# Runs specs. +argv+ is the commandline args as per the spec commandline API, +stderr+
|
6
|
+
# and +stdiout+ are the streams output will be written to, +exit+ tells whether or
|
7
|
+
# not a system exit should be called after the specs are run and
|
8
|
+
# +warn_if_no_files+ tells whether or not a warning (the help message)
|
9
|
+
# should be printed to +stderr+ in case no files are specified.
|
10
|
+
def self.run(argv, stderr, stdout, exit, warn_if_no_files)
|
11
|
+
old_context_runner = defined?($context_runner) ? $context_runner : nil
|
12
|
+
$context_runner = OptionParser.create_context_runner(argv, stderr, stdout, warn_if_no_files)
|
13
|
+
|
14
|
+
# If ARGV is a glob, it will actually each over each one of the matching files.
|
15
|
+
argv.each do |file_or_dir|
|
16
|
+
if File.directory?(file_or_dir)
|
17
|
+
Dir["#{file_or_dir}/**/*.rb"].each do |file|
|
18
|
+
load file
|
19
|
+
end
|
20
|
+
elsif File.file?(file_or_dir)
|
21
|
+
load file_or_dir
|
22
|
+
else
|
23
|
+
raise "File or directory not found: #{file_or_dir}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
$context_runner.run(exit)
|
27
|
+
$context_runner = old_context_runner
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -3,12 +3,10 @@ require File.dirname(__FILE__) + '/../../spec'
|
|
3
3
|
module Spec
|
4
4
|
module Runner
|
5
5
|
class ContextRunner
|
6
|
-
attr_reader :standalone
|
7
6
|
|
8
|
-
def initialize(reporter,
|
7
|
+
def initialize(reporter, dry_run, single_spec=nil)
|
9
8
|
@contexts = []
|
10
9
|
@reporter = reporter
|
11
|
-
@standalone = standalone
|
12
10
|
@dry_run = dry_run
|
13
11
|
@single_spec = single_spec
|
14
12
|
end
|
@@ -1,14 +1,13 @@
|
|
1
1
|
module Kernel
|
2
2
|
def context(name, &block)
|
3
3
|
context = Spec::Runner::Context.new(name, &block)
|
4
|
-
|
5
|
-
runner.add_context(context)
|
4
|
+
context_runner.add_context(context)
|
6
5
|
end
|
7
6
|
|
8
7
|
private
|
9
8
|
|
10
9
|
def context_runner
|
11
|
-
if $context_runner.nil?; $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV.dup,
|
10
|
+
if $context_runner.nil?; $context_runner = ::Spec::Runner::OptionParser.create_context_runner(ARGV.dup, STDERR, STDOUT, false); at_exit { $context_runner.run(false) }; end
|
12
11
|
$context_runner
|
13
12
|
end
|
14
13
|
end
|
@@ -59,8 +59,13 @@ module Spec
|
|
59
59
|
def dump_failure(counter, failure)
|
60
60
|
@output.puts
|
61
61
|
@output.puts "#{counter.to_s})"
|
62
|
-
|
63
|
-
|
62
|
+
if(failure.expectation_not_met?)
|
63
|
+
@output.puts red(failure.header)
|
64
|
+
@output.puts red(failure.exception.message)
|
65
|
+
else
|
66
|
+
@output.puts magenta(failure.header)
|
67
|
+
@output.puts magenta(failure.exception.message)
|
68
|
+
end
|
64
69
|
@output.puts failure.exception.backtrace.join("\n")
|
65
70
|
STDOUT.flush
|
66
71
|
end
|
@@ -88,6 +93,7 @@ module Spec
|
|
88
93
|
|
89
94
|
def red(text); colour(text, "\e[31m"); end
|
90
95
|
def green(text); colour(text, "\e[32m"); end
|
96
|
+
def magenta(text); colour(text, "\e[35m"); end
|
91
97
|
|
92
98
|
def format_backtrace(backtrace)
|
93
99
|
backtrace.nil? ? "" : backtrace.join("\n")
|
@@ -20,8 +20,8 @@ module Spec
|
|
20
20
|
@output.puts "</div>"
|
21
21
|
end
|
22
22
|
@output.puts "<div class=\"context\">"
|
23
|
-
@output.puts " <h2>#{name}</h2>"
|
24
23
|
@output.puts " <ul>"
|
24
|
+
@output.puts " <li class=\"context_name\">#{name}</li>"
|
25
25
|
end
|
26
26
|
|
27
27
|
def start_dump
|
@@ -36,17 +36,17 @@ module Spec
|
|
36
36
|
end
|
37
37
|
|
38
38
|
def spec_passed(name)
|
39
|
-
@output.puts "<li class=\"spec passed\"><div class=\"
|
39
|
+
@output.puts " <li class=\"spec passed\"><div class=\"passed_spec_name\">#{escape(@current_spec)}</div></li>"
|
40
40
|
end
|
41
41
|
|
42
42
|
def spec_failed(name, counter, failure)
|
43
|
-
@output.puts "<li class=\"spec failed\">"
|
44
|
-
@output.puts "
|
45
|
-
@output.puts "
|
46
|
-
@output.puts "
|
47
|
-
@output.puts "
|
48
|
-
@output.puts "
|
49
|
-
@output.puts "</li>"
|
43
|
+
@output.puts " <li class=\"spec failed\">"
|
44
|
+
@output.puts " <div class=\"failed_spec_name\">#{escape(@current_spec)}</div>"
|
45
|
+
@output.puts " <div class=\"failure\" id=\"failure_#{counter}\">"
|
46
|
+
@output.puts " <div class=\"message\"><pre>#{escape(failure.exception.message)}</pre></div>" unless failure.exception.nil?
|
47
|
+
@output.puts " <div class=\"backtrace\"><pre>#{format_backtrace(failure.exception.backtrace)}</pre></div>" unless failure.exception.nil?
|
48
|
+
@output.puts " </div>"
|
49
|
+
@output.puts " </li>"
|
50
50
|
STDOUT.flush
|
51
51
|
end
|
52
52
|
|
@@ -58,8 +58,8 @@ module Spec
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def dump_summary(duration, spec_count, failure_count)
|
61
|
-
@output.
|
62
|
-
@output.
|
61
|
+
@output.puts "</body>"
|
62
|
+
@output.puts "</html>"
|
63
63
|
STDOUT.flush
|
64
64
|
end
|
65
65
|
|
@@ -76,15 +76,11 @@ module Spec
|
|
76
76
|
<meta http-equiv="Content-Script-Type" content="text/javascript" />
|
77
77
|
<style type="text/css">
|
78
78
|
body {
|
79
|
-
font-size:
|
80
|
-
font:
|
79
|
+
font-size: 9pt;
|
80
|
+
font-family: verdana, arial, helvetica;
|
81
81
|
width: 85%;
|
82
82
|
}
|
83
83
|
|
84
|
-
h2 {
|
85
|
-
color: #589CCF;
|
86
|
-
}
|
87
|
-
|
88
84
|
div.context {
|
89
85
|
padding: 0px;
|
90
86
|
background: #fff;
|
@@ -98,23 +94,36 @@ module Spec
|
|
98
94
|
li {
|
99
95
|
list-style-type: none;
|
100
96
|
margin: 0;
|
101
|
-
border:
|
97
|
+
border: 1px solid #fff;
|
98
|
+
}
|
99
|
+
|
100
|
+
li.context_name {
|
101
|
+
font-size: 1.3em;
|
102
|
+
font-weight: bold;
|
103
|
+
color: #589CCF;
|
104
|
+
}
|
105
|
+
|
106
|
+
div.passed_spec_name {
|
107
|
+
font-weight: bold;
|
108
|
+
color: #324F17;
|
109
|
+
}
|
110
|
+
|
111
|
+
div.failed_spec_name {
|
112
|
+
font-weight: bold;
|
113
|
+
color: #EEB4B4;
|
102
114
|
}
|
103
115
|
|
104
116
|
li.passed {
|
105
117
|
display: block;
|
106
|
-
background: #
|
107
|
-
|
108
|
-
padding: 2px 4px;
|
109
|
-
font-weight: bold
|
118
|
+
background: #659D32;
|
119
|
+
padding: 1px 4px;
|
110
120
|
}
|
111
121
|
|
112
122
|
li.failed {
|
113
123
|
display: block;
|
114
|
-
background:
|
115
|
-
color: #
|
124
|
+
background: #CD0000;
|
125
|
+
color: #000;
|
116
126
|
padding: 2px 4px;
|
117
|
-
font-weight: bold
|
118
127
|
}
|
119
128
|
|
120
129
|
li.failed .failure {
|
@@ -9,7 +9,7 @@ module Spec
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def spec_failed(name, counter, failure)
|
12
|
-
@output.
|
12
|
+
@output.puts failure.expectation_not_met? ? red("- #{name} (FAILED - #{counter})") : magenta("- #{name} (ERROR - #{counter})")
|
13
13
|
STDOUT.flush
|
14
14
|
end
|
15
15
|
|
@@ -5,8 +5,8 @@ module Spec
|
|
5
5
|
module Runner
|
6
6
|
class OptionParser
|
7
7
|
|
8
|
-
def self.create_context_runner(args,
|
9
|
-
options = parse(args,
|
8
|
+
def self.create_context_runner(args, err, out, warn_if_no_files)
|
9
|
+
options = parse(args, err, out, warn_if_no_files)
|
10
10
|
|
11
11
|
formatter = options.formatter_type.new(options.out, options.dry_run, options.colour)
|
12
12
|
reporter = Reporter.new(formatter, options.backtrace_tweaker)
|
@@ -17,10 +17,10 @@ module Spec
|
|
17
17
|
Spec::Expectations::Should::Base.differ = options.differ_class.new(options.diff_format, options.context_lines, options.colour)
|
18
18
|
end
|
19
19
|
|
20
|
-
ContextRunner.new(reporter,
|
20
|
+
ContextRunner.new(reporter, options.dry_run, options.spec_name)
|
21
21
|
end
|
22
22
|
|
23
|
-
def self.parse(args,
|
23
|
+
def self.parse(args, err, out, warn_if_no_files)
|
24
24
|
options = OpenStruct.new
|
25
25
|
options.out = out == STDOUT ? Kernel : out
|
26
26
|
options.formatter_type = Formatter::ProgressBarFormatter
|
@@ -120,9 +120,9 @@ module Spec
|
|
120
120
|
end
|
121
121
|
opts.parse!(args)
|
122
122
|
|
123
|
-
if args.empty?
|
124
|
-
err.puts opts
|
125
|
-
exit if err == $stderr
|
123
|
+
if args.empty? && warn_if_no_files
|
124
|
+
err.puts opts
|
125
|
+
exit if err == $stderr
|
126
126
|
end
|
127
127
|
|
128
128
|
options
|
data/lib/spec/runner/reporter.rb
CHANGED
@@ -83,7 +83,15 @@ module Spec
|
|
83
83
|
end
|
84
84
|
|
85
85
|
def header
|
86
|
-
|
86
|
+
if expectation_not_met?
|
87
|
+
"'#{@context_name} #{@spec_name}' FAILED"
|
88
|
+
else
|
89
|
+
"#{@exception.class.name} in '#{@context_name} #{@spec_name}'"
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
def expectation_not_met?
|
94
|
+
@exception.is_a?(Spec::Expectations::ExpectationNotMetError)
|
87
95
|
end
|
88
96
|
|
89
97
|
end
|
data/lib/spec/version.rb
CHANGED
@@ -3,9 +3,9 @@ module Spec
|
|
3
3
|
unless defined? MAJOR
|
4
4
|
MAJOR = 0
|
5
5
|
MINOR = 7
|
6
|
-
TINY =
|
7
|
-
# RANDOM_TOKEN: 0.
|
8
|
-
REV = "$LastChangedRevision:
|
6
|
+
TINY = 1
|
7
|
+
# RANDOM_TOKEN: 0.75692472177863
|
8
|
+
REV = "$LastChangedRevision: 1080 $".match(/LastChangedRevision: (\d+)/)[1]
|
9
9
|
|
10
10
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
11
11
|
FULL_VERSION = "#{STRING} (r#{REV})"
|
@@ -0,0 +1,65 @@
|
|
1
|
+
Index: find_rspecs_home_page.rb
|
2
|
+
===================================================================
|
3
|
+
--- find_rspecs_home_page.rb (revision 767)
|
4
|
+
+++ find_rspecs_home_page.rb (working copy)
|
5
|
+
@@ -2,22 +2,18 @@
|
6
|
+
|
7
|
+
context "Google's search page" do
|
8
|
+
|
9
|
+
- setup do
|
10
|
+
- @browser = Selenium::SeleneseInterpreter.new("localhost", 4444, "*firefox", "http://www.google.no", 10000)
|
11
|
+
- @browser.start
|
12
|
+
- @browser.open('http://www.google.no')
|
13
|
+
- end
|
14
|
+
-
|
15
|
+
specify "should find rspec's home page when I search for rspec" do
|
16
|
+
- @browser.type "name=q", "rspec"
|
17
|
+
- @browser.click_and_wait "name=btnG"
|
18
|
+
- @browser.is_text_present("rspec.rubyforge.org").should_be(true)
|
19
|
+
+ browser.open('http://www.google.no')
|
20
|
+
+ browser.type "name=q", "rspec"
|
21
|
+
+ browser.click_and_wait "name=btnG"
|
22
|
+
+ browser.is_text_present("rspec.rubyforge.org").should_be(true)
|
23
|
+
end
|
24
|
+
|
25
|
+
specify "should not find Ali G when I search for rspec" do
|
26
|
+
- @browser.type "name=q", "rspec"
|
27
|
+
- @browser.click_and_wait "name=btnG"
|
28
|
+
- @browser.is_text_present("Ali G").should_be(false)
|
29
|
+
+ browser.open('http://www.google.no')
|
30
|
+
+ browser.type "name=q", "rspec"
|
31
|
+
+ browser.click_and_wait "name=btnG"
|
32
|
+
+ browser.is_text_present("Ali G").should_be(false)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
Index: rspec_selenium.rb
|
38
|
+
===================================================================
|
39
|
+
--- rspec_selenium.rb (revision 767)
|
40
|
+
+++ rspec_selenium.rb (working copy)
|
41
|
+
@@ -3,10 +3,22 @@
|
42
|
+
require File.dirname(__FILE__) + '/selenium'
|
43
|
+
|
44
|
+
class RSpecSelenium
|
45
|
+
- def teardown
|
46
|
+
- @browser.stop
|
47
|
+
+ def setup
|
48
|
+
+ unless defined?@@browser
|
49
|
+
+ @@browser = Selenium::SeleneseInterpreter.new("localhost", 4444, "*firefox", "http://www.google.no", 10000)
|
50
|
+
+ @@browser.start
|
51
|
+
+ end
|
52
|
+
end
|
53
|
+
+
|
54
|
+
+ def browser
|
55
|
+
+ @@browser
|
56
|
+
+ end
|
57
|
+
+
|
58
|
+
+ def self.shutdown
|
59
|
+
+ @@browser.stop
|
60
|
+
+ end
|
61
|
+
end
|
62
|
+
+at_exit{RSpecSelenium.shutdown}
|
63
|
+
|
64
|
+
module Spec
|
65
|
+
module Runner
|
metadata
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.
|
2
|
+
rubygems_version: 0.9.0
|
3
3
|
specification_version: 1
|
4
4
|
name: rspec
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.7.
|
7
|
-
date: 2006-11-
|
8
|
-
summary: RSpec-0.7.
|
6
|
+
version: 0.7.1
|
7
|
+
date: 2006-11-10 00:00:00 -06:00
|
8
|
+
summary: RSpec-0.7.1 (r1080) - BDD for Ruby http://rspec.rubyforge.org/
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: rspec-devel@rubyforge.org
|
@@ -23,6 +23,9 @@ required_ruby_version: !ruby/object:Gem::Version::Requirement
|
|
23
23
|
version: 0.0.0
|
24
24
|
version:
|
25
25
|
platform: ruby
|
26
|
+
signing_key:
|
27
|
+
cert_chain:
|
28
|
+
post_install_message:
|
26
29
|
authors:
|
27
30
|
- - Steven Baker
|
28
31
|
- Aslak Hellesoy
|
@@ -36,7 +39,6 @@ files:
|
|
36
39
|
- Rakefile
|
37
40
|
- README
|
38
41
|
- lib/spec.rb
|
39
|
-
- lib/spec/callback.rb
|
40
42
|
- lib/spec/expectations.rb
|
41
43
|
- lib/spec/mocks.rb
|
42
44
|
- lib/spec/runner.rb
|
@@ -67,6 +69,7 @@ files:
|
|
67
69
|
- lib/spec/rake/spectask.rb
|
68
70
|
- lib/spec/rake/verify_rcov.rb
|
69
71
|
- lib/spec/runner/backtrace_tweaker.rb
|
72
|
+
- lib/spec/runner/command_line.rb
|
70
73
|
- lib/spec/runner/context.rb
|
71
74
|
- lib/spec/runner/context_eval.rb
|
72
75
|
- lib/spec/runner/context_runner.rb
|
@@ -103,6 +106,7 @@ files:
|
|
103
106
|
- vendor/watir/README.txt
|
104
107
|
- vendor/selenium/find_rspecs_home_page.rb
|
105
108
|
- vendor/selenium/rspec_selenium.rb
|
109
|
+
- vendor/selenium/start_browser_once.patch
|
106
110
|
- vendor/selenium/README.txt
|
107
111
|
test_files: []
|
108
112
|
|
data/lib/spec/callback.rb
DELETED
File without changes
|