jeremymcanally-context 0.5.2 → 0.5.5
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +1 -0
- data/context.gemspec +2 -1
- data/lib/context.rb +7 -1
- data/lib/context/context.rb +2 -2
- data/lib/context/core_ext/rails_hacks.rb +10 -0
- data/lib/context/lifecycle.rb +36 -12
- data/lib/context/test.rb +13 -3
- data/lib/context/version.rb +1 -1
- data/test/test_lifecycle.rb +79 -19
- data/test/test_test.rb +7 -1
- metadata +2 -1
data/Manifest.txt
CHANGED
data/context.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |s|
|
2
2
|
s.name = "context"
|
3
|
-
s.version = "0.5.
|
3
|
+
s.version = "0.5.5"
|
4
4
|
s.date = "2008-10-03"
|
5
5
|
s.summary = "Contexts and DSL sugar for your tests"
|
6
6
|
s.email = "jeremy@entp.com"
|
@@ -27,6 +27,7 @@ Gem::Specification.new do |s|
|
|
27
27
|
"lib/context/test.rb",
|
28
28
|
"lib/context/version.rb",
|
29
29
|
"lib/context/core_ext/string.rb",
|
30
|
+
"lib/context/core_ext/rails_hacks.rb",
|
30
31
|
"setup.rb"
|
31
32
|
]
|
32
33
|
|
data/lib/context.rb
CHANGED
@@ -5,9 +5,15 @@ require 'rubygems'
|
|
5
5
|
require 'test/unit'
|
6
6
|
|
7
7
|
require 'context/core_ext/string'
|
8
|
+
require 'context/core_ext/rails_hacks'
|
9
|
+
|
8
10
|
require 'context/version'
|
9
11
|
require 'context/suite'
|
10
12
|
require 'context/test'
|
11
13
|
require 'context/lifecycle'
|
12
14
|
require 'context/context'
|
13
|
-
require 'context/shared_behavior'
|
15
|
+
require 'context/shared_behavior'
|
16
|
+
|
17
|
+
class Test::Unit::TestCase
|
18
|
+
extend Context::Context
|
19
|
+
end
|
data/lib/context/context.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
module Context
|
2
|
+
module Context
|
3
3
|
# Test::Unit uses ObjectSpace to figure out what Test::Unit:TestCase instances are running
|
4
4
|
# Contexts are not named and therefore sometimes get garbage collected.
|
5
5
|
# Think of #context_list as the shelter for nameless contexts
|
data/lib/context/lifecycle.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
class Test::Unit::TestCase
|
2
2
|
class << self
|
3
|
-
attr_accessor :before_each_callbacks, :before_all_callbacks, :after_each_callbacks, :after_all_callbacks
|
3
|
+
attr_accessor :before_each_callbacks, :before_all_callbacks, :after_each_callbacks, :after_all_callbacks, :before_should_callbacks
|
4
4
|
|
5
5
|
# Add logic to run before the tests (i.e., a +setup+ method)
|
6
6
|
#
|
@@ -9,6 +9,11 @@ class Test::Unit::TestCase
|
|
9
9
|
# end
|
10
10
|
#
|
11
11
|
def before(period = :each, &block)
|
12
|
+
unless block_given?
|
13
|
+
block = period
|
14
|
+
period = :each
|
15
|
+
end
|
16
|
+
|
12
17
|
send("before_#{period}_callbacks") << block
|
13
18
|
end
|
14
19
|
|
@@ -21,6 +26,11 @@ class Test::Unit::TestCase
|
|
21
26
|
# end
|
22
27
|
#
|
23
28
|
def after(period = :each, &block)
|
29
|
+
unless block_given?
|
30
|
+
block = period
|
31
|
+
period = :each
|
32
|
+
end
|
33
|
+
|
24
34
|
send("after_#{period}_callbacks") << block
|
25
35
|
end
|
26
36
|
|
@@ -32,22 +42,28 @@ class Test::Unit::TestCase
|
|
32
42
|
end
|
33
43
|
end
|
34
44
|
|
35
|
-
self.before_all_callbacks
|
36
|
-
self.before_each_callbacks
|
37
|
-
self.after_each_callbacks
|
38
|
-
self.after_all_callbacks
|
45
|
+
self.before_all_callbacks = []
|
46
|
+
self.before_each_callbacks = []
|
47
|
+
self.after_each_callbacks = []
|
48
|
+
self.after_all_callbacks = []
|
49
|
+
self.before_should_callbacks = {}
|
39
50
|
|
40
51
|
def self.inherited(child) # :nodoc:
|
41
52
|
super
|
42
|
-
child.before_all_callbacks
|
43
|
-
child.before_each_callbacks
|
44
|
-
child.after_each_callbacks
|
45
|
-
child.after_all_callbacks
|
53
|
+
child.before_all_callbacks = []
|
54
|
+
child.before_each_callbacks = []
|
55
|
+
child.after_each_callbacks = []
|
56
|
+
child.after_all_callbacks = []
|
57
|
+
child.before_should_callbacks = {}
|
46
58
|
|
47
59
|
child.class_eval do
|
48
60
|
def setup(&block)
|
49
61
|
super
|
50
62
|
|
63
|
+
unless self.class.before_should_callbacks[method_name].nil?
|
64
|
+
instance_eval(&self.class.before_should_callbacks[method_name])
|
65
|
+
end
|
66
|
+
|
51
67
|
run_each_callbacks :before
|
52
68
|
end
|
53
69
|
|
@@ -56,11 +72,13 @@ class Test::Unit::TestCase
|
|
56
72
|
|
57
73
|
run_each_callbacks :after
|
58
74
|
end
|
59
|
-
end
|
75
|
+
end if self == Test::Unit::TestCase
|
60
76
|
end
|
61
77
|
|
62
78
|
def run_each_callbacks(callback_type) # :nodoc:
|
63
|
-
self.class.gather_callbacks(callback_type, :each).each
|
79
|
+
self.class.gather_callbacks(callback_type, :each).each do |c|
|
80
|
+
c.is_a?(Proc) ? instance_eval(&c) : send(c)
|
81
|
+
end
|
64
82
|
end
|
65
83
|
|
66
84
|
def run_all_callbacks(callback_type) # :nodoc:
|
@@ -69,6 +87,12 @@ class Test::Unit::TestCase
|
|
69
87
|
(instance_variables - previous_ivars).inject({}) do |hash, ivar|
|
70
88
|
hash.update ivar => instance_variable_get(ivar)
|
71
89
|
end
|
90
|
+
rescue Object => exception
|
91
|
+
raise <<-BANG
|
92
|
+
Error running the #{callback_type}(:all) callback for #{name}
|
93
|
+
#{exception.class.name}: #{exception.message}
|
94
|
+
#{exception.backtrace.join("\n")}
|
95
|
+
BANG
|
72
96
|
end
|
73
97
|
|
74
98
|
def set_values_from_callbacks(values) # :nodoc:
|
@@ -76,4 +100,4 @@ class Test::Unit::TestCase
|
|
76
100
|
instance_variable_set name, value
|
77
101
|
end
|
78
102
|
end
|
79
|
-
end
|
103
|
+
end
|
data/lib/context/test.rb
CHANGED
@@ -7,11 +7,15 @@ class Test::Unit::TestCase
|
|
7
7
|
# assert_false @user.can?(:delete, @other_user)
|
8
8
|
# end
|
9
9
|
#
|
10
|
-
def test(name, &block)
|
11
|
-
test_name = "
|
10
|
+
def test(name, opts={}, &block)
|
11
|
+
test_name = ["test:", context_name, name].reject { |n| n == "" }.join(' ')
|
12
12
|
# puts "running test #{test_name}"
|
13
13
|
defined = instance_method(test_name) rescue false
|
14
14
|
raise "#{test_name} is already defined in #{self}" if defined
|
15
|
+
|
16
|
+
unless opts[:before].nil?
|
17
|
+
before_should_callbacks[test_name] = opts[:before]
|
18
|
+
end
|
15
19
|
|
16
20
|
if block_given?
|
17
21
|
define_method(test_name, &block)
|
@@ -23,5 +27,11 @@ class Test::Unit::TestCase
|
|
23
27
|
end
|
24
28
|
|
25
29
|
%w(it should tests).each {|m| alias_method m, :test}
|
30
|
+
|
31
|
+
def before_test(name, &block)
|
32
|
+
test(name, :before => block) {}
|
33
|
+
end
|
34
|
+
|
35
|
+
%w(before_it before_should before_tests).each {|m| alias_method m, :before_test}
|
26
36
|
end
|
27
|
-
end
|
37
|
+
end
|
data/lib/context/version.rb
CHANGED
data/test/test_lifecycle.rb
CHANGED
@@ -2,71 +2,87 @@ require File.dirname(__FILE__) + '/test_helper.rb'
|
|
2
2
|
|
3
3
|
class TestLifecycle < Test::Unit::TestCase
|
4
4
|
before do
|
5
|
-
@inherited_before_each_var
|
5
|
+
@inherited_before_each_var ||= 0
|
6
|
+
@inherited_before_each_var += 1
|
6
7
|
end
|
7
8
|
|
8
9
|
before do
|
9
|
-
@inherited_before_each_var
|
10
|
-
@inherited_before_each_var_2
|
10
|
+
@inherited_before_each_var ||= 0
|
11
|
+
@inherited_before_each_var_2 ||= 0
|
12
|
+
@inherited_before_each_var += 2
|
13
|
+
@inherited_before_each_var_2 += 1
|
11
14
|
end
|
12
15
|
|
13
16
|
after do
|
14
|
-
@inherited_after_each_var
|
17
|
+
@inherited_after_each_var ||= 0
|
18
|
+
@inherited_after_each_var += 1
|
15
19
|
end
|
16
20
|
|
17
21
|
before :all do
|
18
|
-
@inherited_before_all_var
|
22
|
+
@inherited_before_all_var ||= 0
|
23
|
+
@inherited_before_all_var += 1
|
19
24
|
end
|
20
25
|
|
21
26
|
after :all do
|
22
|
-
@inherited_after_all_var
|
27
|
+
@inherited_after_all_var ||= 0
|
28
|
+
@inherited_after_all_var += 1
|
23
29
|
end
|
24
30
|
|
25
31
|
sample_test = context "lifecycle" do
|
26
32
|
attr_reader :inherited_before_each_var, :inherited_before_each_var_2, :inherited_after_each_var,
|
27
|
-
:after_each_var, :inherited_before_all_var, :inherited_after_all_var, :before_all_var, :after_all_var,
|
33
|
+
:after_each_var, :inherited_before_all_var, :inherited_after_all_var, :before_all_var, :after_all_var, :ivar,
|
28
34
|
:superclass_before_each_var, :superclass_after_each_var, :superclass_before_all_var, :superclass_after_all_var, :one, :two
|
29
35
|
|
30
36
|
before do
|
31
|
-
@inherited_before_each_var
|
37
|
+
@inherited_before_each_var ||= 0
|
38
|
+
@inherited_before_each_var += 4
|
32
39
|
end
|
33
40
|
|
34
41
|
after do
|
35
|
-
@after_each_var
|
42
|
+
@after_each_var ||= 0
|
43
|
+
@after_each_var += 1
|
36
44
|
end
|
37
45
|
|
38
46
|
before :all do
|
39
|
-
@before_all_var
|
47
|
+
@before_all_var ||= 0
|
48
|
+
@before_all_var += 1
|
40
49
|
end
|
41
50
|
|
42
51
|
after :all do
|
43
|
-
@after_all_var
|
52
|
+
@after_all_var ||= 0
|
53
|
+
@after_all_var += 1
|
44
54
|
end
|
45
55
|
|
56
|
+
after :a_method
|
57
|
+
|
46
58
|
test "foo" do
|
47
59
|
end
|
48
60
|
end
|
49
61
|
|
50
62
|
before do
|
51
|
-
@superclass_before_each_var
|
63
|
+
@superclass_before_each_var ||= 0
|
64
|
+
@superclass_before_each_var += 1
|
52
65
|
end
|
53
66
|
|
54
67
|
after do
|
55
|
-
@superclass_after_each_var
|
68
|
+
@superclass_after_each_var ||= 0
|
69
|
+
@superclass_after_each_var += 1
|
56
70
|
end
|
57
71
|
|
58
72
|
before :all do
|
59
|
-
@superclass_before_all_var
|
73
|
+
@superclass_before_all_var ||= 0
|
74
|
+
@superclass_before_all_var += 1
|
60
75
|
end
|
61
76
|
|
62
77
|
after :all do
|
63
|
-
@superclass_after_all_var
|
78
|
+
@superclass_after_all_var ||= 0
|
79
|
+
@superclass_after_all_var += 1
|
64
80
|
end
|
65
81
|
|
66
82
|
context "With before/after :each blocks" do
|
67
83
|
before do
|
68
84
|
@result = Test::Unit::TestResult.new
|
69
|
-
@test = sample_test.new("
|
85
|
+
@test = sample_test.new("test: lifecycle foo")
|
70
86
|
@test.run(@result) { |inherited_after_each_var, v| }
|
71
87
|
end
|
72
88
|
|
@@ -75,7 +91,7 @@ class TestLifecycle < Test::Unit::TestCase
|
|
75
91
|
end
|
76
92
|
|
77
93
|
it "it runs inherited before callbacks in order" do
|
78
|
-
assert_equal
|
94
|
+
assert_equal 7, @test.inherited_before_each_var
|
79
95
|
end
|
80
96
|
|
81
97
|
it "it runs before callbacks in order" do
|
@@ -93,6 +109,10 @@ class TestLifecycle < Test::Unit::TestCase
|
|
93
109
|
it "it runs after callbacks" do
|
94
110
|
assert_equal 1, @test.after_each_var
|
95
111
|
end
|
112
|
+
|
113
|
+
it "it runs after callbacks specified with method names, instead of blocks" do
|
114
|
+
assert_equal "a method ran", @test.ivar
|
115
|
+
end
|
96
116
|
end
|
97
117
|
|
98
118
|
context "With before/after :all blocks" do
|
@@ -132,7 +152,7 @@ class TestLifecycle < Test::Unit::TestCase
|
|
132
152
|
context "With setup/teardown methods" do
|
133
153
|
before do
|
134
154
|
@result = Test::Unit::TestResult.new
|
135
|
-
@test = sample_test.new("
|
155
|
+
@test = sample_test.new("test: lifecycle foo")
|
136
156
|
|
137
157
|
@test.class.setup do
|
138
158
|
@one = 1
|
@@ -150,7 +170,7 @@ class TestLifecycle < Test::Unit::TestCase
|
|
150
170
|
end
|
151
171
|
|
152
172
|
it "runs setup method block and regular callbacks" do
|
153
|
-
assert_equal
|
173
|
+
assert_equal 7, @test.inherited_before_each_var
|
154
174
|
end
|
155
175
|
|
156
176
|
it "runs teardown method block a la Shoulda" do
|
@@ -161,4 +181,44 @@ class TestLifecycle < Test::Unit::TestCase
|
|
161
181
|
assert_equal 1, @test.after_each_var
|
162
182
|
end
|
163
183
|
end
|
184
|
+
|
185
|
+
context "With the before option" do
|
186
|
+
setup do
|
187
|
+
@jvar = "override success!"
|
188
|
+
end
|
189
|
+
|
190
|
+
l = lambda { @ivar = "awesome" }
|
191
|
+
should "run the lambda", :before => l do
|
192
|
+
assert_equal "awesome", @ivar
|
193
|
+
end
|
194
|
+
|
195
|
+
l = lambda { @jvar = "should be overridden" }
|
196
|
+
should "run the lambda before the setup", :before => l do
|
197
|
+
assert_equal "override success!", @jvar
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
context "Before tests" do
|
202
|
+
# omg this is odd
|
203
|
+
setup do
|
204
|
+
assert_equal "yup, it's set", @ivar
|
205
|
+
end
|
206
|
+
|
207
|
+
before_test "run before the setup block" do
|
208
|
+
@ivar = "yup, it's set"
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
context "To be compatible with rails' expectations" do
|
213
|
+
setup :a_method
|
214
|
+
|
215
|
+
it "should accept a symbol for an argument to setup and run that method at setup time" do
|
216
|
+
assert_equal "a method ran", @ivar
|
217
|
+
end
|
218
|
+
end
|
219
|
+
|
220
|
+
protected
|
221
|
+
def a_method
|
222
|
+
@ivar = "a method ran"
|
223
|
+
end
|
164
224
|
end
|
data/test/test_test.rb
CHANGED
@@ -6,12 +6,18 @@ class TestTest < Test::Unit::TestCase
|
|
6
6
|
assert self.class.respond_to?(method_alias)
|
7
7
|
end
|
8
8
|
end
|
9
|
+
|
10
|
+
def test_before_test_aliases
|
11
|
+
[:before_test, :before_it, :before_should, :before_tests].each do |method_alias|
|
12
|
+
assert self.class.respond_to?(method_alias), method_alias.inspect
|
13
|
+
end
|
14
|
+
end
|
9
15
|
|
10
16
|
context "A test block" do
|
11
17
|
it "should create a test_xxx method" do
|
12
18
|
self.class.test("should create a test method") { true }
|
13
19
|
|
14
|
-
assert self.respond_to?(:
|
20
|
+
assert self.respond_to?("test: A test block should create a test method")
|
15
21
|
end
|
16
22
|
end
|
17
23
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jeremymcanally-context
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jeremy McAnally
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/context/shared_behavior.rb
|
42
42
|
- lib/context/test.rb
|
43
43
|
- lib/context/core_ext/string.rb
|
44
|
+
- lib/context/core_ext/rails_hacks.rb
|
44
45
|
- setup.rb
|
45
46
|
has_rdoc: true
|
46
47
|
homepage: http://github.com/jeremymcanally/context
|