expectations 0.2.6 → 0.2.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/expectations/expectation.rb +11 -0
- data/lib/expectations/object.rb +21 -0
- data/lib/expectations/recorded_expectation.rb +5 -2
- data/lib/expectations/standard_error.rb +12 -0
- data/lib/expectations/state_based_expectation.rb +9 -3
- data/lib/expectations/suite_results.rb +34 -26
- data/lib/expectations/suite_runner.rb +0 -1
- data/lib/expectations.rb +2 -1
- data/rakefile.rb +1 -1
- data/test/failures_test.rb +42 -0
- data/test/successes_test.rb +20 -32
- metadata +3 -2
@@ -11,4 +11,15 @@ class Expectations::Expectation
|
|
11
11
|
end
|
12
12
|
end
|
13
13
|
|
14
|
+
def mock(*args)
|
15
|
+
Expectations::StandardError.print "mock method called from #{caller.first.chomp(":in `__instance_exec0'")}\n"
|
16
|
+
super
|
17
|
+
end
|
18
|
+
|
19
|
+
def warn_for_expects
|
20
|
+
Object.__which_expects__ = ExpectationsExpectsMethod
|
21
|
+
yield
|
22
|
+
ensure
|
23
|
+
Object.__which_expects__ = MochaExpectsMethod
|
24
|
+
end
|
14
25
|
end
|
data/lib/expectations/object.rb
CHANGED
@@ -1,4 +1,25 @@
|
|
1
1
|
class Object
|
2
|
+
module MochaExpectsMethod
|
3
|
+
expects_method = Object.instance_method(:expects)
|
4
|
+
define_method :expects do |*args|
|
5
|
+
expects_method.bind(self).call(*args)
|
6
|
+
end
|
7
|
+
end
|
8
|
+
|
9
|
+
module ExpectationsExpectsMethod
|
10
|
+
def expects(*args)
|
11
|
+
Expectations::StandardError.print "expects method called from #{caller[2].chomp(":in `__instance_exec0'")}\n"
|
12
|
+
MochaExpectsMethod.instance_method(:expects).bind(self).call(*args)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
attr_accessor :__which_expects__
|
17
|
+
include MochaExpectsMethod
|
18
|
+
include ExpectationsExpectsMethod
|
19
|
+
def expects(*args)
|
20
|
+
(__which_expects__ || MochaExpectsMethod).instance_method(:expects).bind(self).call(*args)
|
21
|
+
end
|
22
|
+
|
2
23
|
def to
|
3
24
|
Expectations::Recorder.new(self)
|
4
25
|
end
|
@@ -2,8 +2,11 @@ module Expectations::RecordedExpectation
|
|
2
2
|
def execute
|
3
3
|
begin
|
4
4
|
mocha_setup
|
5
|
-
|
6
|
-
|
5
|
+
expected.subject!
|
6
|
+
warn_for_expects do
|
7
|
+
instance_exec(expected.subject, &block) if block
|
8
|
+
end
|
9
|
+
if expected.verify! && mocha_verify
|
7
10
|
self.extend(Expectations::Results::Fulfilled)
|
8
11
|
else
|
9
12
|
self.extend(Expectations::Results::StateBasedFailure)
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Expectations::StandardError
|
2
|
+
def self.print(string)
|
3
|
+
print_suggestion
|
4
|
+
STDERR.print string
|
5
|
+
end
|
6
|
+
|
7
|
+
def self.print_suggestion
|
8
|
+
return if @suggestion_printed
|
9
|
+
@suggestion_printed = true
|
10
|
+
STDERR.print "Expectations allows you to to create multiple mock expectations, but suggests that you write another test instead.\n"
|
11
|
+
end
|
12
|
+
end
|
@@ -2,8 +2,15 @@ module Expectations::StateBasedExpectation
|
|
2
2
|
def execute
|
3
3
|
begin
|
4
4
|
mocha_setup
|
5
|
-
|
6
|
-
|
5
|
+
warn_for_expects do
|
6
|
+
self.actual = instance_eval(&block)
|
7
|
+
end
|
8
|
+
mocha_verify
|
9
|
+
if expected.expectations_equal_to(actual)
|
10
|
+
self.extend(Expectations::Results::Fulfilled)
|
11
|
+
else
|
12
|
+
self.extend(Expectations::Results::StateBasedFailure)
|
13
|
+
end
|
7
14
|
rescue Exception => ex
|
8
15
|
return self.extend(Expectations::Results::Fulfilled) if expected == ex.class
|
9
16
|
self.extend(Expectations::Results::Error)
|
@@ -13,6 +20,5 @@ module Expectations::StateBasedExpectation
|
|
13
20
|
ensure
|
14
21
|
mocha_teardown
|
15
22
|
end
|
16
|
-
self.extend(Expectations::Results::StateBasedFailure)
|
17
23
|
end
|
18
24
|
end
|
@@ -1,29 +1,29 @@
|
|
1
1
|
class Expectations::SuiteResults
|
2
2
|
attr_accessor :out, :expectations
|
3
|
-
|
3
|
+
|
4
4
|
def initialize(out)
|
5
5
|
self.out, self.expectations = out, []
|
6
6
|
out.print "Expectations "
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def <<(expectation_result)
|
10
10
|
out.print expectation_result.char
|
11
11
|
self.expectations << expectation_result
|
12
12
|
self
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
def succeeded?
|
16
16
|
expectations.all? { |expectation| expectation.fulfilled? }
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
def fulfilled
|
20
20
|
expectations.select { |expectation| expectation.fulfilled? }
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
def errors
|
24
24
|
expectations.select { |expectation| expectation.error? }
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
def failures
|
28
28
|
expectations.select { |expectation| expectation.failure? }
|
29
29
|
end
|
@@ -33,29 +33,37 @@ class Expectations::SuiteResults
|
|
33
33
|
run_time = 0.001 if run_time < 0.001
|
34
34
|
out.puts "\nFinished in #{run_time.to_s.gsub(/(\d*)\.(\d{0,5}).*/,'\1.\2')} seconds"
|
35
35
|
if succeeded?
|
36
|
-
|
36
|
+
print_success
|
37
37
|
else
|
38
|
-
|
39
|
-
out.puts "\n--Errors--" if errors.any?
|
40
|
-
errors.each do |error|
|
41
|
-
out.puts " #{error.file}:#{error.line}:in `expect'" if ENV["TM_MODE"]
|
42
|
-
out.puts "file <#{error.file}>"
|
43
|
-
out.puts "line <#{error.line}>"
|
44
|
-
out.puts "error <#{error.exception.message}>"
|
45
|
-
out.puts "trace #{filter_backtrace(error.exception.backtrace)}"
|
46
|
-
out.puts "#{error.message}" if error.message && error.message.any?
|
47
|
-
out.puts "\n"
|
48
|
-
end
|
49
|
-
out.puts "\n--Failures--" if failures.any?
|
50
|
-
failures.each do |failure|
|
51
|
-
out.puts " #{failure.file}:#{failure.line}:in `expect'" if ENV["TM_MODE"]
|
52
|
-
out.puts "file <#{failure.file}>"
|
53
|
-
out.puts "line <#{failure.line}>"
|
54
|
-
out.puts "#{failure.message}\n\n"
|
55
|
-
end
|
38
|
+
print_fail
|
56
39
|
end
|
57
40
|
end
|
58
41
|
|
42
|
+
def print_success
|
43
|
+
out.puts "\nSuccess: #{fulfilled.size} fulfilled"
|
44
|
+
end
|
45
|
+
|
46
|
+
def print_fail
|
47
|
+
out.puts "\nFailure: #{failures.size} failed, #{errors.size} errors, #{fulfilled.size} fulfilled"
|
48
|
+
out.puts "\n--Errors--" if errors.any?
|
49
|
+
errors.each do |error|
|
50
|
+
out.puts " #{error.file}:#{error.line}:in `expect'" if ENV["TM_MODE"]
|
51
|
+
out.puts "file <#{error.file}>"
|
52
|
+
out.puts "line <#{error.line}>"
|
53
|
+
out.puts "error <#{error.exception.message}>"
|
54
|
+
out.puts "trace #{filter_backtrace(error.exception.backtrace)}"
|
55
|
+
out.puts "#{error.message}" if error.message && error.message.any?
|
56
|
+
out.puts "\n"
|
57
|
+
end
|
58
|
+
out.puts "\n--Failures--" if failures.any?
|
59
|
+
failures.each do |failure|
|
60
|
+
out.puts " #{failure.file}:#{failure.line}:in `expect'" if ENV["TM_MODE"]
|
61
|
+
out.puts "file <#{failure.file}>"
|
62
|
+
out.puts "line <#{failure.line}>"
|
63
|
+
out.puts "#{failure.message}\n\n"
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
59
67
|
def write_junit_xml(path)
|
60
68
|
FileUtils.rm_rf path if File.exist?(path)
|
61
69
|
FileUtils.mkdir_p path
|
@@ -81,7 +89,7 @@ class Expectations::SuiteResults
|
|
81
89
|
end
|
82
90
|
end
|
83
91
|
end
|
84
|
-
|
92
|
+
|
85
93
|
def filter_backtrace(trace)
|
86
94
|
patterns_to_strip = [/\/expectations\/lib\/expectations\//, /\/lib\/ruby\/1\.8\//]
|
87
95
|
result = patterns_to_strip.inject(trace) do |result, element|
|
data/lib/expectations.rb
CHANGED
@@ -32,4 +32,5 @@ require File.expand_path(File.dirname(__FILE__) + '/expectations/suite_results')
|
|
32
32
|
require File.expand_path(File.dirname(__FILE__) + '/expectations/expectation')
|
33
33
|
require File.expand_path(File.dirname(__FILE__) + '/expectations/state_based_expectation')
|
34
34
|
require File.expand_path(File.dirname(__FILE__) + '/expectations/mock_recorder')
|
35
|
-
require File.expand_path(File.dirname(__FILE__) + '/expectations/results')
|
35
|
+
require File.expand_path(File.dirname(__FILE__) + '/expectations/results')
|
36
|
+
require File.expand_path(File.dirname(__FILE__) + '/expectations/standard_error')
|
data/rakefile.rb
CHANGED
@@ -46,7 +46,7 @@ specification = Gem::Specification.new do |s|
|
|
46
46
|
expect NoMethodError do
|
47
47
|
Object.invalid_method_call
|
48
48
|
end."
|
49
|
-
s.version = "0.2.
|
49
|
+
s.version = "0.2.7"
|
50
50
|
s.author = 'Jay Fields'
|
51
51
|
s.description = "A lightweight unit testing framework. Tests (expectations) will be written as follows
|
52
52
|
expect 2 do
|
data/test/failures_test.rb
CHANGED
@@ -24,6 +24,7 @@ Expectations do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
expect Expectations::Results::BehaviorBasedFailure do
|
27
|
+
Expectations::StandardError.stubs(:print)
|
27
28
|
suite = Expectations::Suite.new
|
28
29
|
suite.expect Mocha::Mock.new.to.receive(:dial).with("2125551212").times(2) do |phone|
|
29
30
|
phone.dial("2125551212")
|
@@ -32,6 +33,7 @@ Expectations do
|
|
32
33
|
end
|
33
34
|
|
34
35
|
expect Expectations::Results::BehaviorBasedFailure do
|
36
|
+
Expectations::StandardError.stubs(:print)
|
35
37
|
suite = Expectations::Suite.new
|
36
38
|
suite.expect(Object.to.receive(:deal)) { }
|
37
39
|
suite.execute(Silent).expectations.first
|
@@ -44,6 +46,7 @@ Expectations do
|
|
44
46
|
end
|
45
47
|
|
46
48
|
expect Expectations::Results::Error do
|
49
|
+
Expectations::StandardError.stubs(:print)
|
47
50
|
suite = Expectations::Suite.new
|
48
51
|
suite.expect(2) do
|
49
52
|
Object.expects(:bar).returns 2
|
@@ -53,6 +56,7 @@ Expectations do
|
|
53
56
|
end
|
54
57
|
|
55
58
|
expect Expectations::Results::Error do
|
59
|
+
Expectations::StandardError.stubs(:print)
|
56
60
|
suite = Expectations::Suite.new
|
57
61
|
suite.expect(1) do
|
58
62
|
Object.expects(:give_me_three).with(3).returns 1
|
@@ -61,4 +65,42 @@ Expectations do
|
|
61
65
|
suite.execute(Silent).expectations.first
|
62
66
|
end
|
63
67
|
|
68
|
+
expect Expectations::Results::Error do
|
69
|
+
Expectations::StandardError.stubs(:print)
|
70
|
+
suite = Expectations::Suite.new
|
71
|
+
suite.expect(1) do
|
72
|
+
Object.expects(:foo)
|
73
|
+
end
|
74
|
+
suite.execute(Silent).expectations.first
|
75
|
+
end
|
76
|
+
|
77
|
+
expect Expectations::Results::Error do
|
78
|
+
Expectations::StandardError.stubs(:print)
|
79
|
+
suite = Expectations::Suite.new
|
80
|
+
suite.expect(1) do
|
81
|
+
mock(:foo => 1)
|
82
|
+
end
|
83
|
+
suite.execute(Silent).expectations.first
|
84
|
+
end
|
85
|
+
|
86
|
+
expect Expectations::Results::BehaviorBasedFailure do
|
87
|
+
Expectations::StandardError.stubs(:print)
|
88
|
+
suite = Expectations::Suite.new
|
89
|
+
suite.expect(Object.to.receive(:foo)) do
|
90
|
+
Object.foo
|
91
|
+
mock(:foo => 1)
|
92
|
+
end
|
93
|
+
suite.execute(Silent).expectations.first
|
94
|
+
end
|
95
|
+
|
96
|
+
expect Expectations::Results::BehaviorBasedFailure do
|
97
|
+
Expectations::StandardError.stubs(:print)
|
98
|
+
suite = Expectations::Suite.new
|
99
|
+
suite.expect(Object.to.receive(:foo)) do
|
100
|
+
Object.foo
|
101
|
+
Object.expects(:bar)
|
102
|
+
end
|
103
|
+
suite.execute(Silent).expectations.first
|
104
|
+
end
|
105
|
+
|
64
106
|
end
|
data/test/successes_test.rb
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
require File.dirname(__FILE__) + "/test_helper"
|
2
2
|
|
3
3
|
Expectations do
|
4
|
-
|
4
|
+
|
5
5
|
# State based expectation where a value equals another value
|
6
6
|
expect 2 do
|
7
7
|
1 + 1
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
# State based expectation where an exception is expected. Simply expect the Class of the intended exception
|
11
11
|
expect NoMethodError do
|
12
12
|
Object.no_method
|
13
13
|
end
|
14
|
-
|
14
|
+
|
15
15
|
# Behavior based test using a traditional mock
|
16
16
|
expect mock.to.receive(:dial).with("2125551212").times(2) do |phone|
|
17
17
|
phone.dial("2125551212")
|
@@ -34,34 +34,22 @@ Expectations do
|
|
34
34
|
expect Object.to.receive(:deal) do
|
35
35
|
Object.deal
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
# State based test utilizing a stub
|
39
39
|
expect 2 do
|
40
40
|
stub(:two => 2).two
|
41
41
|
end
|
42
|
-
|
43
|
-
# State based test utilizing a concrete mock
|
44
|
-
expect 2 do
|
45
|
-
Object.expects(:bar).returns 2
|
46
|
-
Object.bar
|
47
|
-
end
|
48
|
-
|
49
|
-
# Behavior based test utilizing a stub and a concrete mock
|
50
|
-
expect 1 do
|
51
|
-
Object.expects(:give_me_three).with(3).returns 1
|
52
|
-
Object.give_me_three(stub(:three=>3).three)
|
53
|
-
end
|
54
|
-
|
42
|
+
|
55
43
|
# State based test matching a Regexp
|
56
44
|
expect /a string/ do
|
57
45
|
"a string"
|
58
46
|
end
|
59
|
-
|
47
|
+
|
60
48
|
# State based test checking if actual is in the expected Range
|
61
49
|
expect 1..5 do
|
62
50
|
3
|
63
51
|
end
|
64
|
-
|
52
|
+
|
65
53
|
# State based test to determine if the object is an instance of the module
|
66
54
|
expect Enumerable do
|
67
55
|
[]
|
@@ -71,33 +59,33 @@ Expectations do
|
|
71
59
|
expect String do
|
72
60
|
"a string"
|
73
61
|
end
|
74
|
-
|
62
|
+
|
75
63
|
# State based test to determine if the modules are the same
|
76
64
|
expect Enumerable do
|
77
65
|
Enumerable
|
78
66
|
end
|
79
|
-
|
67
|
+
|
80
68
|
# State based test to determine if the classes are the same
|
81
69
|
expect String do
|
82
70
|
String
|
83
71
|
end
|
84
|
-
|
72
|
+
|
85
73
|
# State based test with XML strings, whitespace between tags is ignored
|
86
74
|
expect xml("<a><foo>bar</foo></a>") do
|
87
75
|
"<a>\n\t<foo>bar</foo> \n</a>"
|
88
76
|
end
|
89
|
-
|
77
|
+
|
90
78
|
# State based test with XML strings, whitespace between tags is ignored
|
91
79
|
expect xml(<<-eos) do
|
92
80
|
<one>
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
81
|
+
<two>
|
82
|
+
<three>4</three>
|
83
|
+
<five> 6 </five>
|
84
|
+
</two>
|
97
85
|
</one>
|
98
86
|
eos
|
99
87
|
"<one><two><three>4</three>
|
100
|
-
|
88
|
+
<five> 6 </five>
|
101
89
|
</two></one>"
|
102
90
|
end
|
103
91
|
|
@@ -111,7 +99,7 @@ Expectations do
|
|
111
99
|
expect klass.new.to.delegate(:save).to(:record) do |instance|
|
112
100
|
instance.save(1)
|
113
101
|
end
|
114
|
-
|
102
|
+
|
115
103
|
# this is normally defined in the file specific to the class
|
116
104
|
klass = Class.new do
|
117
105
|
attr_accessor :started
|
@@ -120,7 +108,7 @@ Expectations do
|
|
120
108
|
expect klass.new.to.be.started do |process|
|
121
109
|
process.started = true
|
122
110
|
end
|
123
|
-
|
111
|
+
|
124
112
|
# this is normally defined in the file specific to the class
|
125
113
|
klass = Class.new do
|
126
114
|
attr_accessor :finished
|
@@ -129,8 +117,8 @@ Expectations do
|
|
129
117
|
expect klass.new.to.have.finished do |process|
|
130
118
|
process.finished = true
|
131
119
|
end
|
132
|
-
|
120
|
+
|
133
121
|
expect nil.to.be.nil?
|
134
122
|
expect Object.not.to.be.nil?
|
135
|
-
|
123
|
+
|
136
124
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: expectations
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jay Fields
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date: 2008-
|
12
|
+
date: 2008-04-09 00:00:00 -04:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -42,6 +42,7 @@ files:
|
|
42
42
|
- lib/expectations/regexp.rb
|
43
43
|
- lib/expectations/results.rb
|
44
44
|
- lib/expectations/reverse_result.rb
|
45
|
+
- lib/expectations/standard_error.rb
|
45
46
|
- lib/expectations/state_based_expectation.rb
|
46
47
|
- lib/expectations/state_based_recorder.rb
|
47
48
|
- lib/expectations/string.rb
|