mspec 1.5.11 → 1.5.12
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/lib/mspec/commands/mspec-ci.rb +1 -0
- data/lib/mspec/commands/mspec-run.rb +1 -0
- data/lib/mspec/commands/mspec-tag.rb +1 -0
- data/lib/mspec/helpers.rb +4 -0
- data/lib/mspec/helpers/ducktype.rb +33 -0
- data/lib/mspec/helpers/enumerator_class.rb +9 -0
- data/lib/mspec/helpers/environment.rb +10 -1
- data/lib/mspec/helpers/hash.rb +27 -0
- data/lib/mspec/helpers/io.rb +4 -0
- data/lib/mspec/helpers/metaclass.rb +7 -0
- data/lib/mspec/matchers.rb +5 -0
- data/lib/mspec/matchers/have_class_variable.rb +12 -0
- data/lib/mspec/matchers/have_constant.rb +6 -24
- data/lib/mspec/matchers/have_instance_variable.rb +12 -0
- data/lib/mspec/matchers/have_protected_instance_method.rb +24 -0
- data/lib/mspec/matchers/have_public_instance_method.rb +24 -0
- data/lib/mspec/matchers/stringsymboladapter.rb +1 -1
- data/lib/mspec/matchers/variable.rb +28 -0
- data/lib/mspec/mocks/mock.rb +70 -47
- data/lib/mspec/mocks/object.rb +4 -0
- data/lib/mspec/mocks/proxy.rb +17 -3
- data/lib/mspec/runner.rb +1 -0
- data/lib/mspec/runner/exception.rb +4 -3
- data/lib/mspec/utils/options.rb +10 -2
- data/lib/mspec/version.rb +1 -1
- data/spec/commands/mkspec_spec.rb +1 -1
- data/spec/commands/mspec_ci_spec.rb +5 -0
- data/spec/commands/mspec_run_spec.rb +5 -0
- data/spec/commands/mspec_spec.rb +2 -2
- data/spec/commands/mspec_tag_spec.rb +5 -0
- data/spec/expectations/should.rb +1 -0
- data/spec/helpers/ducktype_spec.rb +44 -0
- data/spec/helpers/enumerator_class_spec.rb +19 -0
- data/spec/helpers/hash_spec.rb +30 -0
- data/spec/helpers/io_spec.rb +5 -0
- data/spec/matchers/have_class_variable_spec.rb +75 -0
- data/spec/matchers/have_instance_variable_spec.rb +75 -0
- data/spec/matchers/have_protected_instance_method_spec.rb +57 -0
- data/spec/matchers/have_public_instance_method_spec.rb +53 -0
- data/spec/matchers/stringsymboladapter_spec.rb +8 -10
- data/spec/mocks/mock_spec.rb +5 -5
- data/spec/runner/exception_spec.rb +17 -10
- data/spec/utils/options_spec.rb +26 -0
- metadata +18 -2
data/lib/mspec/mocks/object.rb
CHANGED
data/lib/mspec/mocks/proxy.rb
CHANGED
@@ -9,6 +9,20 @@ class MockObject
|
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
12
|
+
class NumericMockObject < Numeric
|
13
|
+
def initialize(name, options={})
|
14
|
+
@name = name
|
15
|
+
@null = options[:null_object]
|
16
|
+
end
|
17
|
+
|
18
|
+
def method_missing(sym, *args, &block)
|
19
|
+
@null ? self : super
|
20
|
+
end
|
21
|
+
|
22
|
+
def singleton_method_added(val)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
12
26
|
class MockProxy
|
13
27
|
def initialize(type=nil)
|
14
28
|
@multiple_returns = nil
|
@@ -88,7 +102,7 @@ class MockProxy
|
|
88
102
|
def with(*args)
|
89
103
|
raise ArgumentError, "you must specify the expected arguments" if args.empty?
|
90
104
|
@arguments = *args
|
91
|
-
if
|
105
|
+
if (behaves_like_ruby_1_9 = *[])
|
92
106
|
@arguments = @arguments.first if @arguments.length <= 1
|
93
107
|
end
|
94
108
|
self
|
@@ -112,11 +126,11 @@ class MockProxy
|
|
112
126
|
@yielding << args
|
113
127
|
self
|
114
128
|
end
|
115
|
-
|
129
|
+
|
116
130
|
def yielding
|
117
131
|
@yielding
|
118
132
|
end
|
119
|
-
|
133
|
+
|
120
134
|
def yielding?
|
121
135
|
!@yielding.empty?
|
122
136
|
end
|
data/lib/mspec/runner.rb
CHANGED
@@ -1,8 +1,6 @@
|
|
1
1
|
class ExceptionState
|
2
2
|
attr_reader :description, :describe, :it, :exception
|
3
3
|
|
4
|
-
PATH = /#{File.expand_path(File.dirname(__FILE__) + '/../../..')}/
|
5
|
-
|
6
4
|
def initialize(state, location, exception)
|
7
5
|
@exception = exception
|
8
6
|
|
@@ -33,11 +31,14 @@ class ExceptionState
|
|
33
31
|
end
|
34
32
|
|
35
33
|
def backtrace
|
34
|
+
@backtrace_filter ||= MSpecScript.config[:backtrace_filter]
|
35
|
+
|
36
36
|
begin
|
37
37
|
bt = @exception.awesome_backtrace.show.split "\n"
|
38
38
|
rescue Exception
|
39
39
|
bt = @exception.backtrace || []
|
40
40
|
end
|
41
|
-
|
41
|
+
|
42
|
+
bt.select { |line| $MSPEC_DEBUG or @backtrace_filter !~ line }.join("\n")
|
42
43
|
end
|
43
44
|
end
|
data/lib/mspec/utils/options.rb
CHANGED
@@ -207,7 +207,7 @@ class MSpecOptions
|
|
207
207
|
|
208
208
|
def targets
|
209
209
|
on("-t", "--target", "TARGET",
|
210
|
-
"Implementation to run the specs, where:") do |t|
|
210
|
+
"Implementation to run the specs, where TARGET is:") do |t|
|
211
211
|
case t
|
212
212
|
when 'r', 'ruby'
|
213
213
|
config[:target] = 'ruby'
|
@@ -232,7 +232,8 @@ class MSpecOptions
|
|
232
232
|
doc " x or rubinius invokes ./bin/rbx"
|
233
233
|
doc " X or rbx invokes rbx in PATH"
|
234
234
|
doc " j or jruby invokes jruby in PATH"
|
235
|
-
doc " i or ironruby invokes ir in PATH
|
235
|
+
doc " i or ironruby invokes ir in PATH"
|
236
|
+
doc " full path to EXE invokes EXE directly\n"
|
236
237
|
|
237
238
|
on("-T", "--target-opt", "OPT",
|
238
239
|
"Pass OPT as a flag to the target implementation") do |t|
|
@@ -440,4 +441,11 @@ class MSpecOptions
|
|
440
441
|
config[:gdb] = true
|
441
442
|
end
|
442
443
|
end
|
444
|
+
|
445
|
+
def debug
|
446
|
+
on("-d", "--debug",
|
447
|
+
"Set MSpec debugging flag for more verbose output") do
|
448
|
+
$MSPEC_DEBUG = true
|
449
|
+
end
|
450
|
+
end
|
443
451
|
end
|
data/lib/mspec/version.rb
CHANGED
@@ -172,7 +172,7 @@ describe MkSpec, "#write_spec" do
|
|
172
172
|
|
173
173
|
it "checks if specs exist for the method if the spec file exists" do
|
174
174
|
@script.should_receive(:`).with(
|
175
|
-
/
|
175
|
+
%r"#{@script.ruby} #{MSPEC_HOME}/bin/mspec-run --dry-run -fs -e 'Object#inspect' spec/core/tcejbo/inspect_spec.rb")
|
176
176
|
@script.write_spec("spec/core/tcejbo/inspect_spec.rb", "Object#inspect", true)
|
177
177
|
end
|
178
178
|
|
@@ -88,6 +88,11 @@ describe MSpecCI, "#options" do
|
|
88
88
|
@script.options
|
89
89
|
end
|
90
90
|
|
91
|
+
it "enables the debug option" do
|
92
|
+
@options.should_receive(:debug)
|
93
|
+
@script.options @argv
|
94
|
+
end
|
95
|
+
|
91
96
|
it "calls #custom_options" do
|
92
97
|
@script.should_receive(:custom_options).with(@options)
|
93
98
|
@script.options
|
@@ -118,6 +118,11 @@ describe MSpecRun, "#options" do
|
|
118
118
|
@script.options @argv
|
119
119
|
end
|
120
120
|
|
121
|
+
it "enables the debug option" do
|
122
|
+
@options.should_receive(:debug)
|
123
|
+
@script.options @argv
|
124
|
+
end
|
125
|
+
|
121
126
|
it "exits if there are no files to process" do
|
122
127
|
@options.should_receive(:parse).and_return([])
|
123
128
|
@script.should_receive(:exit)
|
data/spec/commands/mspec_spec.rb
CHANGED
@@ -239,7 +239,7 @@ describe MSpecMain, "#run" do
|
|
239
239
|
end
|
240
240
|
|
241
241
|
it "uses exec to invoke the runner script" do
|
242
|
-
@script.should_receive(:exec).with("ruby", "-v", %r"
|
242
|
+
@script.should_receive(:exec).with("ruby", "-v", %r"#{MSPEC_HOME}/bin/mspec-run$")
|
243
243
|
@script.options []
|
244
244
|
@script.run
|
245
245
|
end
|
@@ -248,7 +248,7 @@ describe MSpecMain, "#run" do
|
|
248
248
|
@script.should_receive(:multi_exec).and_return do |arg|
|
249
249
|
arg.length.should == 3
|
250
250
|
arg[0].should == "-v"
|
251
|
-
arg[1].should =~ %r"
|
251
|
+
arg[1].should =~ %r"#{MSPEC_HOME}/bin/mspec-ci$"
|
252
252
|
arg[2].should == "-fy"
|
253
253
|
end
|
254
254
|
@script.options ["ci", "-j"]
|
@@ -98,6 +98,11 @@ describe MSpecTag, "#options" do
|
|
98
98
|
@script.options @argv
|
99
99
|
end
|
100
100
|
|
101
|
+
it "enables the debug option" do
|
102
|
+
@options.should_receive(:debug)
|
103
|
+
@script.options @argv
|
104
|
+
end
|
105
|
+
|
101
106
|
it "calls #custom_options" do
|
102
107
|
@script.should_receive(:custom_options).with(@options)
|
103
108
|
@script.options @argv
|
data/spec/expectations/should.rb
CHANGED
@@ -0,0 +1,44 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/helpers/ducktype'
|
3
|
+
|
4
|
+
describe Object, "#responds_to" do
|
5
|
+
it "returns true for specified symbols" do
|
6
|
+
obj = mock("obj")
|
7
|
+
obj.responds_to(:to_flo)
|
8
|
+
obj.should respond_to(:to_flo)
|
9
|
+
obj.should respond_to(:to_s)
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
describe Object, "#does_not_respond_to" do
|
14
|
+
it "returns false for specified symbols" do
|
15
|
+
obj = mock("obj")
|
16
|
+
obj.does_not_respond_to(:to_s)
|
17
|
+
obj.should_not respond_to(:to_s)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
describe Object, "#undefine" do
|
22
|
+
it "undefines the method" do
|
23
|
+
# cannot use a mock here because of the way RSpec handles method_missing
|
24
|
+
obj = Object.new
|
25
|
+
obj.undefine(:to_s)
|
26
|
+
lambda { obj.send :to_s }.should raise_error(NoMethodError)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
describe Object, "#fake!" do
|
31
|
+
before :each do
|
32
|
+
@obj = mock("obj")
|
33
|
+
end
|
34
|
+
|
35
|
+
it "makes the object respond to the message" do
|
36
|
+
@obj.fake!(:to_flo)
|
37
|
+
@obj.should respond_to(:to_flo)
|
38
|
+
end
|
39
|
+
|
40
|
+
it "returns the value when the obj is sent the message" do
|
41
|
+
@obj.fake!(:to_flo, 1.2)
|
42
|
+
@obj.to_flo.should == 1.2
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/helpers/enumerator_class'
|
3
|
+
|
4
|
+
describe "#enumerator_class" do
|
5
|
+
|
6
|
+
ruby_version_is ''...'1.8.7' do
|
7
|
+
it "returns Enumerable::Enumerator in Ruby 1.8.6-" do
|
8
|
+
lambda { enumerator_class }.should raise_error(NameError)
|
9
|
+
require 'enumerator'
|
10
|
+
enumerator_class.should == Enumerable::Enumerator
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
ruby_version_is '1.8.7' do
|
15
|
+
it "returns Enumerator in Ruby 1.8.7+" do
|
16
|
+
enumerator_class.should == Enumerator
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/helpers/hash'
|
3
|
+
|
4
|
+
describe Object, "#hash_class" do
|
5
|
+
it "returns the Hash class" do
|
6
|
+
hash_class.should == Hash
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
describe Object, "#new_hash" do
|
11
|
+
it "returns a default hash" do
|
12
|
+
new_hash.should == {}
|
13
|
+
end
|
14
|
+
|
15
|
+
it "returns a hash having a default value" do
|
16
|
+
hash = new_hash(5)
|
17
|
+
hash[:none].should == 5
|
18
|
+
end
|
19
|
+
|
20
|
+
it "returns a hash having a default proc" do
|
21
|
+
hash = new_hash { |h, k| h[k] = :default }
|
22
|
+
hash[:none].should == :default
|
23
|
+
end
|
24
|
+
|
25
|
+
it "returns a hash constructed from keys and values" do
|
26
|
+
new_hash({:a => 1, :b => 2}).should == { :a => 1, :b => 2 }
|
27
|
+
new_hash(1 => 2, 3 => 4).should == { 1 => 2, 3 => 4 }
|
28
|
+
new_hash(1, 2, 3, 4).should == { 1 => 2, 3 => 4 }
|
29
|
+
end
|
30
|
+
end
|
data/spec/helpers/io_spec.rb
CHANGED
@@ -32,6 +32,11 @@ describe IOStub do
|
|
32
32
|
@out.should == "hello\n1\n2\n3\n"
|
33
33
|
end
|
34
34
|
|
35
|
+
it "provides a printf method" do
|
36
|
+
@out.printf "%-10s, %03d, %2.1f", "test", 42, 4.2
|
37
|
+
@out.should == "test , 042, 4.2"
|
38
|
+
end
|
39
|
+
|
35
40
|
it "provides a flush method that does nothing and returns self" do
|
36
41
|
@out.flush.should == @out
|
37
42
|
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/expectations/expectations'
|
3
|
+
require 'mspec/matchers/have_class_variable'
|
4
|
+
|
5
|
+
class IVarModMock; end
|
6
|
+
|
7
|
+
shared_examples_for "have_class_variable, on all Ruby versions" do
|
8
|
+
after :all do
|
9
|
+
Object.const_set :RUBY_VERSION, @ruby_version
|
10
|
+
end
|
11
|
+
|
12
|
+
it "matches when mod has the class variable, given as string" do
|
13
|
+
matcher = HaveClassVariableMatcher.new('@foo')
|
14
|
+
matcher.matches?(IVarModMock).should be_true
|
15
|
+
end
|
16
|
+
|
17
|
+
it "matches when mod has the class variable, given as symbol" do
|
18
|
+
matcher = HaveClassVariableMatcher.new(:@foo)
|
19
|
+
matcher.matches?(IVarModMock).should be_true
|
20
|
+
end
|
21
|
+
|
22
|
+
it "does not match when mod hasn't got the class variable, given as string" do
|
23
|
+
matcher = HaveClassVariableMatcher.new('@bar')
|
24
|
+
matcher.matches?(IVarModMock).should be_false
|
25
|
+
end
|
26
|
+
|
27
|
+
it "does not match when mod hasn't got the class variable, given as symbol" do
|
28
|
+
matcher = HaveClassVariableMatcher.new(:@bar)
|
29
|
+
matcher.matches?(IVarModMock).should be_false
|
30
|
+
end
|
31
|
+
|
32
|
+
it "provides a failure message for #should" do
|
33
|
+
matcher = HaveClassVariableMatcher.new(:@bar)
|
34
|
+
matcher.matches?(IVarModMock)
|
35
|
+
matcher.failure_message.should == [
|
36
|
+
"Expected IVarModMock to have class variable '@bar'",
|
37
|
+
"but it does not"
|
38
|
+
]
|
39
|
+
end
|
40
|
+
|
41
|
+
it "provides a failure messoge for #should_not" do
|
42
|
+
matcher = HaveClassVariableMatcher.new(:@bar)
|
43
|
+
matcher.matches?(IVarModMock)
|
44
|
+
matcher.negative_failure_message.should == [
|
45
|
+
"Expected IVarModMock NOT to have class variable '@bar'",
|
46
|
+
"but it does"
|
47
|
+
]
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe HaveClassVariableMatcher, "on RUBY_VERSION < 1.9" do
|
52
|
+
before :all do
|
53
|
+
@ruby_version = Object.const_get :RUBY_VERSION
|
54
|
+
Object.const_set :RUBY_VERSION, '1.8.6'
|
55
|
+
|
56
|
+
def IVarModMock.class_variables
|
57
|
+
['@foo']
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
it_should_behave_like "have_class_variable, on all Ruby versions"
|
62
|
+
end
|
63
|
+
|
64
|
+
describe HaveClassVariableMatcher, "on RUBY_VERSION >= 1.9" do
|
65
|
+
before :all do
|
66
|
+
@ruby_version = Object.const_get :RUBY_VERSION
|
67
|
+
Object.const_set :RUBY_VERSION, '1.9.0'
|
68
|
+
|
69
|
+
def IVarModMock.class_variables
|
70
|
+
[:@foo]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it_should_behave_like "have_class_variable, on all Ruby versions"
|
75
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper'
|
2
|
+
require 'mspec/expectations/expectations'
|
3
|
+
require 'mspec/matchers/have_instance_variable'
|
4
|
+
|
5
|
+
shared_examples_for "have_instance_variable, on all Ruby versions" do
|
6
|
+
after :all do
|
7
|
+
Object.const_set :RUBY_VERSION, @ruby_version
|
8
|
+
end
|
9
|
+
|
10
|
+
it "matches when object has the instance variable, given as string" do
|
11
|
+
matcher = HaveInstanceVariableMatcher.new('@foo')
|
12
|
+
matcher.matches?(@object).should be_true
|
13
|
+
end
|
14
|
+
|
15
|
+
it "matches when object has the instance variable, given as symbol" do
|
16
|
+
matcher = HaveInstanceVariableMatcher.new(:@foo)
|
17
|
+
matcher.matches?(@object).should be_true
|
18
|
+
end
|
19
|
+
|
20
|
+
it "does not match when object hasn't got the instance variable, given as string" do
|
21
|
+
matcher = HaveInstanceVariableMatcher.new('@bar')
|
22
|
+
matcher.matches?(@object).should be_false
|
23
|
+
end
|
24
|
+
|
25
|
+
it "does not match when object hasn't got the instance variable, given as symbol" do
|
26
|
+
matcher = HaveInstanceVariableMatcher.new(:@bar)
|
27
|
+
matcher.matches?(@object).should be_false
|
28
|
+
end
|
29
|
+
|
30
|
+
it "provides a failure message for #should" do
|
31
|
+
matcher = HaveInstanceVariableMatcher.new(:@bar)
|
32
|
+
matcher.matches?(@object)
|
33
|
+
matcher.failure_message.should == [
|
34
|
+
"Expected #{@object.inspect} to have instance variable '@bar'",
|
35
|
+
"but it does not"
|
36
|
+
]
|
37
|
+
end
|
38
|
+
|
39
|
+
it "provides a failure messoge for #should_not" do
|
40
|
+
matcher = HaveInstanceVariableMatcher.new(:@bar)
|
41
|
+
matcher.matches?(@object)
|
42
|
+
matcher.negative_failure_message.should == [
|
43
|
+
"Expected #{@object.inspect} NOT to have instance variable '@bar'",
|
44
|
+
"but it does"
|
45
|
+
]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe HaveInstanceVariableMatcher, "on RUBY_VERSION < 1.9" do
|
50
|
+
before :all do
|
51
|
+
@ruby_version = Object.const_get :RUBY_VERSION
|
52
|
+
Object.const_set :RUBY_VERSION, '1.8.6'
|
53
|
+
|
54
|
+
@object = Object.new
|
55
|
+
def @object.instance_variables
|
56
|
+
['@foo']
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
it_should_behave_like "have_instance_variable, on all Ruby versions"
|
61
|
+
end
|
62
|
+
|
63
|
+
describe HaveInstanceVariableMatcher, "on RUBY_VERSION >= 1.9" do
|
64
|
+
before :all do
|
65
|
+
@ruby_version = Object.const_get :RUBY_VERSION
|
66
|
+
Object.const_set :RUBY_VERSION, '1.9.0'
|
67
|
+
|
68
|
+
@object = Object.new
|
69
|
+
def @object.instance_variables
|
70
|
+
[:@foo]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
it_should_behave_like "have_instance_variable, on all Ruby versions"
|
75
|
+
end
|