rspec 0.5.10 → 0.5.11
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 +7 -0
- data/doc/src/tools/rails.page +46 -0
- data/doc/src/tools/test2spec.page +13 -2
- data/lib/spec/test_to_spec/ruby2ruby.rb +3 -1
- data/lib/spec/test_to_spec/sexp_transformer.rb +25 -16
- data/lib/spec/test_to_spec/translation_test_runner.rb +3 -1
- data/lib/spec/version.rb +1 -1
- data/test/spec/test_to_spec/sexp_transformer_test.rb +77 -7
- data/test/spec/test_to_spec/testfiles/test_unit_api_test.rb +6 -0
- metadata +3 -3
data/CHANGES
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
= RSpec Changelog
|
2
2
|
|
3
|
+
== Version 0.5.11
|
4
|
+
This release makes test2spec usable with Rails (with some manual steps).
|
5
|
+
See http://rspec.rubyforge.org/tools/rails.html for more details
|
6
|
+
|
7
|
+
* test2spec now correctly translates bodies of helper methods (non- test_*, setup and teardown ones).
|
8
|
+
* Added more documentation about how to get test2spec to work with Rails.
|
9
|
+
|
3
10
|
== Version 0.5.10
|
4
11
|
This version features a second rewrite of test2spec - hopefully better than the previous one.
|
5
12
|
|
data/doc/src/tools/rails.page
CHANGED
@@ -84,3 +84,49 @@ Model:
|
|
84
84
|
|
85
85
|
Controller:
|
86
86
|
<ruby file="../vendor/rspec_on_rails/spec/controllers/person_controller_spec.rb"/>
|
87
|
+
|
88
|
+
h3. Translating existing Test::Unit tests
|
89
|
+
|
90
|
+
The test2spec tool that ships with RSpec translates existing tests into RSpec specs.
|
91
|
+
Translating tests to specs in a Rails environment requires some manual steps...
|
92
|
+
|
93
|
+
h4. Install the rspec_generator
|
94
|
+
How to do this is described above
|
95
|
+
|
96
|
+
h4. Modify your test/test_helper.rb
|
97
|
+
In order to be able to translate any Rails tests, you must modify your test/test_helper.rb file:
|
98
|
+
<pre>
|
99
|
+
# This line must be commented out in order for test2spec to work.
|
100
|
+
# require 'test_help'
|
101
|
+
require 'test2spec_help'
|
102
|
+
</pre>
|
103
|
+
|
104
|
+
The reason for this is that the <tt>test_help</tt> mixin confuses test2spec to the point
|
105
|
+
where it's unable to perform the translation. The <tt>test2spec_help</tt> addresses this
|
106
|
+
shortcoming.
|
107
|
+
|
108
|
+
h4. Perform the translations
|
109
|
+
Now you can translate your unit tests (model tests) with:
|
110
|
+
<pre>
|
111
|
+
test2spec --template spec/test2spec.erb --specdir spec/models test/unit
|
112
|
+
</pre>
|
113
|
+
and your functional tests (controller tests) with:
|
114
|
+
<pre>
|
115
|
+
test2spec --template spec/test2spec.erb --specdir spec/controllers test/functional
|
116
|
+
</pre>
|
117
|
+
|
118
|
+
h4. Edit your translated specs
|
119
|
+
test2spec currently doesn't translate class-level statements such as <tt>fixtures</tt>, so you have to do this yourself.
|
120
|
+
Copy all the <tt>fixtures</tt> statements in your tests to the corresponding contexts. Example:
|
121
|
+
|
122
|
+
<ruby>
|
123
|
+
context "The Foo Model" do
|
124
|
+
fixtures :foo
|
125
|
+
end
|
126
|
+
</ruby>
|
127
|
+
|
128
|
+
h4. Make sure fixtures are found.
|
129
|
+
By default, RSpec on Rails expects to find fixtures under <tt>spec/fixtures</tt>. You should either move your
|
130
|
+
existing <tt>test/fixtures/*.yml</tt> files to <tt>spec/fixtures</tt> or edit your <tt>spec/spec_helper.rb</tt>
|
131
|
+
to point to the old <tt>test/fixtures</tt> location. Beware that every time you do a <tt>script/generate rspec_model</tt>,
|
132
|
+
new fixstures will always be written to <tt>spec/fixtures</tt>.
|
@@ -59,12 +59,23 @@ h2. Sample translation
|
|
59
59
|
h2. What's translated?
|
60
60
|
|
61
61
|
test2spec only translates classes that extend from Test::Unit - and their methods. It will not bring over any
|
62
|
-
code that isn't inside a Test::Unit class. This means that require statements at the top of your file, any
|
63
|
-
classes in the same file as the test class
|
62
|
+
code that isn't inside a Test::Unit class. This means that require statements at the top of your file, any
|
63
|
+
non-Test::Unit classes (even if they are in in the same file as the test class) *will not be translated*.
|
64
|
+
|
65
|
+
We recommend that you manually write a spec_helper.rb file with require statements and put it at the top
|
66
|
+
of your spec directory. Also, write a test2spec.erb file that will put a <tt>require</tt> of that file at
|
67
|
+
the top of each translated spec. Use the <tt>--template</tt> option to specify this erb file when you run test2spec.
|
68
|
+
|
69
|
+
Sometimes, test classes have helper methods that don't start with test_ (and that are not setup or teardown).
|
70
|
+
These methods will be moved inside the setup block, and will also have any core Test::Unit assert_* methods
|
71
|
+
translated. (Non-Test::Unit core assert_ methods will not be translated.)
|
64
72
|
|
65
73
|
So, there is a fair chance that you will have to do some manual editing after test2spec has run. We're only
|
66
74
|
aiming to get most of the translation job done for you - not all of it.
|
67
75
|
|
76
|
+
If you're translating Rails tests, please refer to the RSpec on Rails page for more detail of what needs to
|
77
|
+
be done.
|
78
|
+
|
68
79
|
h2. Troubleshooting
|
69
80
|
|
70
81
|
In some cases, test2spec will not be able to translate a test class. In that case, please submit a bug report
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# Taken from http://dark.fhtr.org/ruby2ruby.rb
|
2
2
|
|
3
|
+
require 'pp'
|
3
4
|
require 'rubygems'
|
4
5
|
begin
|
5
6
|
require 'parse_tree'
|
@@ -484,7 +485,8 @@ class RubyToRuby < SexpProcessor
|
|
484
485
|
end
|
485
486
|
|
486
487
|
def process_bmethod(exp)
|
487
|
-
|
488
|
+
exp.clear
|
489
|
+
""
|
488
490
|
end
|
489
491
|
|
490
492
|
end
|
@@ -30,11 +30,7 @@ module Spec
|
|
30
30
|
def initialize
|
31
31
|
super
|
32
32
|
self.expected = Array
|
33
|
-
|
34
|
-
|
35
|
-
def process(exp)
|
36
|
-
#puts "PROCESS:#{exp[0]}"
|
37
|
-
super
|
33
|
+
@regular_method = false
|
38
34
|
end
|
39
35
|
|
40
36
|
def process_class(exp)
|
@@ -61,10 +57,15 @@ super
|
|
61
57
|
unless setup.empty?
|
62
58
|
setup_block = process(setup.shift)
|
63
59
|
unless methods.empty?
|
60
|
+
translated_methods = []
|
61
|
+
# At this stage we don't want to translate :lvar to :dvar
|
62
|
+
@regular_method = true
|
63
|
+
translated_methods << process(methods.shift) until methods.empty?
|
64
|
+
@regular_method = false
|
64
65
|
if setup_block.length == 3
|
65
|
-
setup_block +=
|
66
|
+
setup_block += translated_methods
|
66
67
|
else
|
67
|
-
setup_block[3] +=
|
68
|
+
setup_block[3] += translated_methods
|
68
69
|
end
|
69
70
|
end
|
70
71
|
context_body << setup_block
|
@@ -109,20 +110,26 @@ super
|
|
109
110
|
result[-1] += @dasgn_decl unless @dasgn_decl.empty?
|
110
111
|
result[-1] += block_body unless block_body == [[:nil]]
|
111
112
|
result
|
113
|
+
else
|
114
|
+
# Return the same method, but process the innards
|
115
|
+
result = [exp.shift, exp.shift] + process(exp)
|
116
|
+
result
|
112
117
|
end
|
113
118
|
end
|
114
119
|
|
115
120
|
def process_lasgn(exp)
|
116
121
|
result = exp.dup
|
117
|
-
result[0] = :dasgn_curr
|
118
|
-
decl = result[0..1].dup
|
119
|
-
if @dasgn_decl.empty?
|
120
|
-
@dasgn_decl += [decl]
|
121
|
-
else
|
122
|
-
@dasgn_decl_tail << decl
|
123
|
-
end
|
124
|
-
@dasgn_decl_tail = decl
|
125
122
|
exp.clear
|
123
|
+
unless @regular_method
|
124
|
+
result[0] = :dasgn_curr
|
125
|
+
decl = result[0..1].dup
|
126
|
+
if @dasgn_decl.empty?
|
127
|
+
@dasgn_decl += [decl]
|
128
|
+
else
|
129
|
+
@dasgn_decl_tail << decl
|
130
|
+
end
|
131
|
+
@dasgn_decl_tail = decl
|
132
|
+
end
|
126
133
|
result
|
127
134
|
end
|
128
135
|
|
@@ -180,8 +187,10 @@ super
|
|
180
187
|
|
181
188
|
def process_lvar(exp)
|
182
189
|
result = exp.dup
|
183
|
-
result[0] = :dvar
|
184
190
|
exp.clear
|
191
|
+
unless @regular_method
|
192
|
+
result[0] = :dvar
|
193
|
+
end
|
185
194
|
result
|
186
195
|
end
|
187
196
|
end
|
data/lib/spec/version.rb
CHANGED
@@ -168,6 +168,32 @@ module Spec
|
|
168
168
|
end
|
169
169
|
end
|
170
170
|
end
|
171
|
+
|
172
|
+
class NinthTest < Test::Unit::TestCase
|
173
|
+
def test_2_should_be_pair
|
174
|
+
foo = 1
|
175
|
+
assert_pair(2)
|
176
|
+
end
|
177
|
+
|
178
|
+
def assert_pair(n)
|
179
|
+
assert_equal 0, n%2
|
180
|
+
end
|
181
|
+
end
|
182
|
+
class NinthContext
|
183
|
+
def wrapper
|
184
|
+
context "Ninth" do
|
185
|
+
setup do
|
186
|
+
def assert_pair(n)
|
187
|
+
(n%2).should_equal 0
|
188
|
+
end
|
189
|
+
end
|
190
|
+
specify "2 should be pair" do
|
191
|
+
foo = 1
|
192
|
+
assert_pair(2)
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
171
197
|
|
172
198
|
class SexpTransformerTest < Test::Unit::TestCase
|
173
199
|
def test_first
|
@@ -202,13 +228,59 @@ module Spec
|
|
202
228
|
should_translate_class_to_context('Eighth')
|
203
229
|
end
|
204
230
|
|
205
|
-
def
|
206
|
-
|
207
|
-
|
231
|
+
def test_ninth
|
232
|
+
should_translate_class_to_context('Ninth')
|
233
|
+
end
|
234
|
+
|
235
|
+
class Something
|
236
|
+
def method_with_asserts
|
237
|
+
assert_equal 2, 3
|
238
|
+
end
|
239
|
+
end
|
240
|
+
class SomethingTranslated
|
241
|
+
def method_with_asserts
|
242
|
+
3.should_equal 2
|
243
|
+
end
|
244
|
+
end
|
245
|
+
def test_translates_regular_method_bodies
|
246
|
+
something = ParseTree.new.parse_tree_for_method(Something, :method_with_asserts)
|
247
|
+
expected_something_translated = ParseTree.new.parse_tree_for_method(SomethingTranslated, :method_with_asserts)
|
248
|
+
actual_something_translated = @t.process(something)
|
249
|
+
verify_sexp_equal expected_something_translated, actual_something_translated
|
250
|
+
end
|
251
|
+
|
252
|
+
def should_translate_class_to_context(name, debug=false)
|
253
|
+
test_class_name = "#{name}Test"
|
254
|
+
context_class_name = "#{name}Context"
|
255
|
+
t = test_class_exp(eval(test_class_name))
|
256
|
+
if(debug)
|
257
|
+
puts "ORIGINAL"
|
258
|
+
pp t
|
259
|
+
end
|
260
|
+
c = wrapper_exp(eval(context_class_name))
|
208
261
|
|
209
262
|
trans = @t.process(t)
|
263
|
+
|
210
264
|
verify_sexp_equal c, trans
|
211
|
-
|
265
|
+
|
266
|
+
=begin
|
267
|
+
if c != trans
|
268
|
+
# Try to print out the Ruby2Ruby of the trans
|
269
|
+
begin
|
270
|
+
trans2ruby = @r2r.process(trans.dup[0])
|
271
|
+
# Parse the translation again
|
272
|
+
retranslated_class_name = "#{context_class_name}Retranslated"
|
273
|
+
eval "class #{retranslated_class_name}\ndef wrapper\n#{trans2ruby}\nend\nend"
|
274
|
+
retranslated_class = eval(retranslated_class_name)
|
275
|
+
retranslated_tree = wrapper_exp(retranslated_class)
|
276
|
+
retranslated_tree
|
277
|
+
verify_sexp_equal c, retranslated_tree
|
278
|
+
rescue SexpProcessorError => e
|
279
|
+
# That didn't work, just print the tree
|
280
|
+
verify_sexp_equal c, trans
|
281
|
+
end
|
282
|
+
end
|
283
|
+
=end
|
212
284
|
# Verify that we can evaluate it after translated by R2R
|
213
285
|
eval(@r2r.process(trans[0]))
|
214
286
|
end
|
@@ -217,9 +289,7 @@ module Spec
|
|
217
289
|
ParseTree.new.parse_tree(klass)[0]
|
218
290
|
end
|
219
291
|
|
220
|
-
def
|
221
|
-
#pp ParseTree.new.parse_tree_for_method(klass, :wrapper)
|
222
|
-
#exit
|
292
|
+
def wrapper_exp(klass)
|
223
293
|
ParseTree.new.parse_tree_for_method(klass, :wrapper)[2][1][2..-1]
|
224
294
|
end
|
225
295
|
|
@@ -9,10 +9,16 @@ class TestUnitApiTest < Test::Unit::TestCase
|
|
9
9
|
def teardown
|
10
10
|
end
|
11
11
|
|
12
|
+
def assert_pair(n)
|
13
|
+
assert_equal 0, n%2
|
14
|
+
end
|
15
|
+
|
12
16
|
def test_can_be_translated_to_rspec
|
13
17
|
a_float = 123.45
|
14
18
|
a_nil = nil
|
15
19
|
|
20
|
+
assert_pair(2)
|
21
|
+
|
16
22
|
assert true
|
17
23
|
assert_not_nil @an_int
|
18
24
|
assert_block { true }
|
metadata
CHANGED
@@ -3,9 +3,9 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: rspec
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.5.
|
7
|
-
date: 2006-06-
|
8
|
-
summary: RSpec-0.5.
|
6
|
+
version: 0.5.11
|
7
|
+
date: 2006-06-15 00:00:00 -05:00
|
8
|
+
summary: RSpec-0.5.11 - BDD for Ruby http://rspec.rubyforge.org/
|
9
9
|
require_paths:
|
10
10
|
- lib
|
11
11
|
email: rspec-devel@rubyforge.org
|