jordi-xml_struct 0.1.2 → 0.1.3
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/README.markdown +18 -4
- data/TODO +1 -0
- data/WHATSNEW +9 -1
- data/lib/xml_struct.rb +15 -5
- data/test/test_helper.rb +8 -8
- data/test/vendor/test-spec/README +378 -0
- data/test/vendor/test-spec/ROADMAP +1 -0
- data/test/vendor/test-spec/Rakefile +146 -0
- data/test/vendor/test-spec/SPECS +161 -0
- data/test/vendor/test-spec/TODO +2 -0
- data/test/vendor/test-spec/bin/specrb +107 -0
- data/test/vendor/test-spec/examples/stack.rb +38 -0
- data/test/vendor/test-spec/examples/stack_spec.rb +119 -0
- data/test/vendor/test-spec/lib/test/spec/dox.rb +148 -0
- data/test/vendor/test-spec/lib/test/spec/rdox.rb +25 -0
- data/test/vendor/test-spec/lib/test/spec/should-output.rb +49 -0
- data/test/vendor/test-spec/lib/test/spec/version.rb +8 -0
- data/test/vendor/test-spec/lib/test/spec.rb +660 -0
- data/test/vendor/test-spec/test/spec_dox.rb +39 -0
- data/test/vendor/test-spec/test/spec_flexmock.rb +209 -0
- data/test/vendor/test-spec/test/spec_mocha.rb +104 -0
- data/test/vendor/test-spec/test/spec_nestedcontexts.rb +26 -0
- data/test/vendor/test-spec/test/spec_new_style.rb +80 -0
- data/test/vendor/test-spec/test/spec_should-output.rb +26 -0
- data/test/vendor/test-spec/test/spec_testspec.rb +699 -0
- data/test/vendor/test-spec/test/spec_testspec_order.rb +26 -0
- data/test/vendor/test-spec/test/test_testunit.rb +22 -0
- data/test/xml_struct_test.rb +60 -54
- data/xml_struct.gemspec +41 -11
- metadata +33 -3
data/README.markdown
CHANGED
@@ -121,11 +121,25 @@ all methods it doesn't contain to the collection below, so you get:
|
|
121
121
|
|
122
122
|
student.courses.collect { |c| c.downcase.to_sym } => [:math, :biology]
|
123
123
|
|
124
|
-
###
|
124
|
+
### Attribute auto "type-casting"
|
125
125
|
|
126
|
-
|
127
|
-
floats via `to_f`. Strings that look like booleans are also
|
128
|
-
only if called by their question mark names (such as
|
126
|
+
Attribute strings that look like integers are promoted via `to_i`, and
|
127
|
+
similarly floats via `to_f`. Strings that look like booleans are also
|
128
|
+
promoted, but only if called by their question mark names (such as
|
129
|
+
`enabled?`.)
|
130
|
+
|
131
|
+
At first, elements appear to do the same, but they don't, really. (I'd like
|
132
|
+
to, but one can't define methods on, say `5`, or `-1.2`.) So in the case of
|
133
|
+
the following XML:
|
134
|
+
|
135
|
+
<thing><name>Foo</name></thing>
|
136
|
+
|
137
|
+
While `thing.name == 'Foo'` is `true`, `thing.name => <XMLStruct ...>`. The
|
138
|
+
consequence is that you can call `String` methods on `thing.name` (such as
|
139
|
+
`upcase`, or `==`), but if you assign it to a new variable, you will not get
|
140
|
+
a `String` object. To do that, call `thing.name.to_obj`, which will return
|
141
|
+
you the auto type-casted (see above) version of `thing.name`, in this case
|
142
|
+
`"Foo"`.
|
129
143
|
|
130
144
|
### Slow
|
131
145
|
|
data/TODO
CHANGED
data/WHATSNEW
CHANGED
@@ -1,3 +1,11 @@
|
|
1
|
+
* 0.1.3 (2008-10-10):
|
2
|
+
- Switched tests to use test/spec
|
3
|
+
- Added XMLStruct#to_obj to return the corresponding Ruby object value
|
4
|
+
- Added XMLStruct#to_raw_xml to return the REXML object
|
5
|
+
- Added documentation on auto-typecasting behaviour caveat
|
6
|
+
|
7
|
+
* 0.1.2 (2008-10-10):
|
8
|
+
- Documentation
|
9
|
+
|
1
10
|
* 0.1.1 (2008-10-10):
|
2
11
|
- First "release" ;)
|
3
|
-
|
data/lib/xml_struct.rb
CHANGED
@@ -21,17 +21,27 @@ class XMLStruct
|
|
21
21
|
@raw.attributes.each { |n, v| __set_attribute n, v }
|
22
22
|
end
|
23
23
|
|
24
|
+
# Returns the raw REXML::Element object used to build this XMLStruct
|
25
|
+
def to_raw_xml
|
26
|
+
@raw
|
27
|
+
end
|
28
|
+
|
29
|
+
# Returns the Ruby value to which we pass missing methods
|
30
|
+
def to_obj
|
31
|
+
@value
|
32
|
+
end
|
33
|
+
|
24
34
|
# An XMLStruct is blank when it has a blank value, no child elements,
|
25
35
|
# and no attributes. For example:
|
26
36
|
#
|
27
37
|
# <blank_element></blank_element>
|
28
38
|
def blank?
|
29
|
-
|
39
|
+
to_obj.blank? && @children.blank? && @attributes.blank?
|
30
40
|
end
|
31
41
|
|
32
42
|
# XMLStruct objects are compared according to their values
|
33
43
|
def <=>(other)
|
34
|
-
|
44
|
+
to_obj <=> other
|
35
45
|
end
|
36
46
|
|
37
47
|
# Array-notation access to elements and attributes. It comes handy when
|
@@ -80,17 +90,17 @@ class XMLStruct
|
|
80
90
|
|
81
91
|
%w[ true yes t y ].include? boolish.downcase
|
82
92
|
|
83
|
-
elsif
|
93
|
+
elsif to_obj.blank? && (@children.size == 1) &&
|
84
94
|
(single_child = @children.values.first).respond_to?(method)
|
85
95
|
|
86
96
|
single_child.send method, *args, &block
|
87
97
|
else
|
88
|
-
|
98
|
+
to_obj.send method, *args, &block
|
89
99
|
end
|
90
100
|
end
|
91
101
|
|
92
102
|
def inspect # :nodoc:
|
93
|
-
%{ #<#{self.class.to_s} value=#{
|
103
|
+
%{ #<#{self.class.to_s} value=#{to_obj.inspect} (#{to_obj.class.to_s})
|
94
104
|
attributes=[#{@attributes.keys.map(&:to_s).join(', ') }]
|
95
105
|
children=[#{@children.keys.map(&:to_s).join(', ') }]> }.squish
|
96
106
|
end
|
data/test/test_helper.rb
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'test/unit'
|
2
2
|
require 'rubygems'
|
3
|
+
require File.join(File.dirname(__FILE__),
|
4
|
+
'vendor', 'test-spec', 'lib', 'test', 'spec')
|
3
5
|
|
4
6
|
begin
|
5
7
|
require 'redgreen'
|
@@ -7,6 +9,12 @@ rescue LoadError
|
|
7
9
|
puts "Install the 'redgreen' gem to get color output"
|
8
10
|
end
|
9
11
|
|
12
|
+
begin
|
13
|
+
require 'ruby-prof'
|
14
|
+
rescue LoadError
|
15
|
+
puts "Install the 'ruby-prof' gem (>= 0.6.1) to get profiling information"
|
16
|
+
end
|
17
|
+
|
10
18
|
require File.join(File.dirname(__FILE__), '..', 'lib', 'xml_struct')
|
11
19
|
|
12
20
|
def xml_file(name_symbol)
|
@@ -23,14 +31,6 @@ require 'digest/md5'
|
|
23
31
|
end
|
24
32
|
|
25
33
|
class Test::Unit::TestCase
|
26
|
-
def self.should(do_stuff_that_is_true, &block)
|
27
|
-
|
28
|
-
object = to_s.split('Test').first
|
29
|
-
method = "test that #{object} should #{do_stuff_that_is_true}"
|
30
|
-
|
31
|
-
define_method(method.intern) { assert block.bind(self).call }
|
32
|
-
end
|
33
|
-
|
34
34
|
def debug
|
35
35
|
require 'ruby-debug'; debugger
|
36
36
|
end
|
@@ -0,0 +1,378 @@
|
|
1
|
+
= test/spec, a BDD interface for Test::Unit
|
2
|
+
|
3
|
+
Copyright (C) 2006, 2007, 2008 Christian Neukirchen <mailto:chneukirchen@gmail.com>
|
4
|
+
|
5
|
+
|
6
|
+
== What is test/spec?
|
7
|
+
|
8
|
+
test/spec layers an RSpec-inspired interface on top of Test::Unit, so
|
9
|
+
you can mix TDD and BDD (Behavior-Driven Development).
|
10
|
+
|
11
|
+
test/spec is a clean-room implementation that maps most kinds of
|
12
|
+
Test::Unit assertions to a `should'-like syntax.
|
13
|
+
|
14
|
+
Consider this Test::Unit test case:
|
15
|
+
|
16
|
+
class TestFoo < Test::Unit::TestCase
|
17
|
+
def test_should_bar
|
18
|
+
assert_equal 5, 2 + 3
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
In test/spec, it looks like this:
|
23
|
+
|
24
|
+
require 'test/spec'
|
25
|
+
|
26
|
+
context "Foo" do
|
27
|
+
specify "should bar" do
|
28
|
+
(2 + 3).should.equal 5
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Since test/spec 0.4, you can also use the new RSpec 1.0 style:
|
33
|
+
|
34
|
+
require 'test/spec'
|
35
|
+
|
36
|
+
describe "Foo" do
|
37
|
+
it "should bar" do
|
38
|
+
(2 + 3).should.equal 5
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
test/spec does not include a mocking/stubbing-framework; use whichever
|
43
|
+
you like to. test/spec has been tested successfully with FlexMock and
|
44
|
+
Mocha.
|
45
|
+
|
46
|
+
test/spec has no dependencies outside Ruby 1.8.
|
47
|
+
|
48
|
+
|
49
|
+
== Mixing test/spec and test/unit
|
50
|
+
|
51
|
+
test/spec and Test::Unit contexts/test cases can be intermixed freely,
|
52
|
+
run in the same test and live in the same files. You can just add them
|
53
|
+
to your Rake::TestTask, too. test/spec allows you to leverage your
|
54
|
+
full existing Test::Unit infrastructure.
|
55
|
+
|
56
|
+
test/spec does not change Test::Unit with the exception of
|
57
|
+
monkey-patching Test::Unit::TestSuite to order the test cases before
|
58
|
+
running them. (This should not do any harm, but if you know a way
|
59
|
+
around it, please tell me.)
|
60
|
+
|
61
|
+
test/spec adds seven global methods, Object#should, Kernel.context,
|
62
|
+
Kernel.xcontext, Kernel.shared_context, Kernel.describe,
|
63
|
+
Kernel.xdescribe, and Kernel.describe_shared. The Kernel methods are
|
64
|
+
private.
|
65
|
+
|
66
|
+
You can use <tt>assert_*</tt> freely in specify-blocks; Object#should
|
67
|
+
works in plain Test::Unit test cases, too, but they will not be counted.
|
68
|
+
|
69
|
+
|
70
|
+
== Wrapped assertions
|
71
|
+
|
72
|
+
+assert_equal+:: <tt>should.equal</tt>, <tt>should ==</tt>
|
73
|
+
+assert_not_equal+:: <tt>should.not.equal</tt>, <tt>should.not ==</tt>
|
74
|
+
+assert_same+:: <tt>should.be</tt>
|
75
|
+
+assert_not_same+:: <tt>should.not.be</tt>
|
76
|
+
+assert_nil+:: <tt>should.be.nil</tt>
|
77
|
+
+assert_not_nil+:: <tt>should.not.be.nil</tt>
|
78
|
+
+assert_in_delta+:: <tt>should.be.close</tt>
|
79
|
+
+assert_match+:: <tt>should.match</tt>, <tt>should =~</tt>
|
80
|
+
+assert_no_match+:: <tt>should.not.match</tt>, <tt>should.not =~</tt>
|
81
|
+
|
82
|
+
+assert_instance_of+:: <tt>should.be.an.instance_of</tt>
|
83
|
+
+assert_kind_of+:: <tt>should.be.a.kind_of</tt>
|
84
|
+
+assert_respond_to+:: <tt>should.respond_to</tt>
|
85
|
+
+assert_raise+:: <tt>should.raise</tt>
|
86
|
+
+assert_nothing_raised+:: <tt>should.not.raise</tt>
|
87
|
+
+assert_throws+:: <tt>should.throw</tt>
|
88
|
+
+assert_nothing_thrown+:: <tt>should.not.throw</tt>
|
89
|
+
|
90
|
+
+assert_block+:: <tt>should.satisfy</tt>
|
91
|
+
|
92
|
+
(+a+, +an+ and +be+ without arguments are optional and no-ops.)
|
93
|
+
|
94
|
+
|
95
|
+
== Additional assertions
|
96
|
+
|
97
|
+
These assertions are not included in Test::Unit, but have been added
|
98
|
+
to test/spec for convenience:
|
99
|
+
|
100
|
+
* <tt>should.not.satisfy</tt>
|
101
|
+
* <tt>should.include</tt>
|
102
|
+
* <tt>a.should.</tt>_predicate_ (works like <tt>assert
|
103
|
+
a.</tt>_predicate_<tt>?</tt>)
|
104
|
+
* <tt>a.should.be </tt>_operator_ (where _operator_ is one of <tt>></tt>, <tt>>=</tt>, <tt><</tt>, <tt><=</tt> or <tt>===</tt>)
|
105
|
+
* <tt>should.output</tt> (require test/spec/should-output)
|
106
|
+
|
107
|
+
If you write an useful general-purpose assertion, I'd like to hear of
|
108
|
+
it and may add it to the test/spec distribution.
|
109
|
+
|
110
|
+
|
111
|
+
== Messaging/Blaming
|
112
|
+
|
113
|
+
With more complex assertions, it may be helpful to provide a message
|
114
|
+
to show if the assertion has failed. This can be done with the
|
115
|
+
Should#blaming or Should#messaging methods:
|
116
|
+
|
117
|
+
RUBY_VERSION.should.messaging("Ruby too old.").be > "1.8.4"
|
118
|
+
|
119
|
+
(1 + 1).should.blaming("weird math").not.equal 11
|
120
|
+
|
121
|
+
|
122
|
+
== Custom shoulds ("Matchers")
|
123
|
+
|
124
|
+
To capture recurring patterns in parts of your specifications, you can
|
125
|
+
define custom "shoulds" (RSpec calls them "matchers") in your
|
126
|
+
contexts, or include modules of them:
|
127
|
+
|
128
|
+
context "Numbers"
|
129
|
+
class EqualString < Test::Spec::CustomShould
|
130
|
+
def matches?(other)
|
131
|
+
object == other.to_s
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def equal_string(str)
|
136
|
+
EqualString.new(str)
|
137
|
+
end
|
138
|
+
|
139
|
+
specify "should have to_s"
|
140
|
+
42.should equal_string("42")
|
141
|
+
end
|
142
|
+
end
|
143
|
+
|
144
|
+
Alternatively, your implementation can define
|
145
|
+
CustomShould#assumptions, where you can use test/spec assertions
|
146
|
+
instead of Boolean predicates:
|
147
|
+
|
148
|
+
class EqualString < Test::Spec::CustomShould
|
149
|
+
def assumptions(other)
|
150
|
+
object.should.equal other.to_s
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
A CustomShould by default takes one argument, which is placed in
|
155
|
+
self.object for your convenience.
|
156
|
+
|
157
|
+
You can CustomShould#failure_message to provide a better error
|
158
|
+
message.
|
159
|
+
|
160
|
+
|
161
|
+
== SpecDox and RDox
|
162
|
+
|
163
|
+
test/spec adds two additional test runners to Test::Unit, based on the
|
164
|
+
console runner but with a different output format.
|
165
|
+
|
166
|
+
SpecDox, run with <tt>--runner=specdox</tt> (or <tt>-rs</tt>) looks
|
167
|
+
like RSpec's output:
|
168
|
+
|
169
|
+
should.output
|
170
|
+
- works for print
|
171
|
+
- works for puts
|
172
|
+
- works with readline
|
173
|
+
|
174
|
+
RDox, run with <tt>--runner=rdox</tt> (or <tt>-rr</tt>) can be
|
175
|
+
included for RDoc documentation (e.g. see SPECS):
|
176
|
+
|
177
|
+
== should.output
|
178
|
+
* works for print
|
179
|
+
* works for puts
|
180
|
+
* works with readline
|
181
|
+
|
182
|
+
SpecDox and RDox work for Test::Unit too:
|
183
|
+
|
184
|
+
$ ruby -r test/spec test/testunit/test_testresult.rb -rs
|
185
|
+
|
186
|
+
Test::Unit::TC_TestResult
|
187
|
+
- fault notification
|
188
|
+
- passed?
|
189
|
+
- result changed notification
|
190
|
+
|
191
|
+
Finished in 0.106647 seconds.
|
192
|
+
|
193
|
+
3 specifications (30 requirements), 0 failures
|
194
|
+
|
195
|
+
Since version 0.4, SpecDox and RDox also notice and count empty
|
196
|
+
specifications.
|
197
|
+
|
198
|
+
|
199
|
+
== Disabled specifications
|
200
|
+
|
201
|
+
Akin to the usual Test::Unit practice, tests quickly can be disabled
|
202
|
+
by replacing +specify+ with +xspecify+ (or +it+ with +xit+).
|
203
|
+
test/spec will count the disabled tests when you run it with SpecDox
|
204
|
+
or RDox.
|
205
|
+
|
206
|
+
When you use xspecify/xit, you also can drop the block. This is
|
207
|
+
useful for writing specifications that you haven't yet started
|
208
|
+
implementing.
|
209
|
+
|
210
|
+
Complete contexts can be disabled by using +xcontext+/+xdescribe+.
|
211
|
+
|
212
|
+
|
213
|
+
== Setup/Teardown
|
214
|
+
|
215
|
+
Setup/Teardown methods are run in this order:
|
216
|
+
|
217
|
+
* before(:all) in order of definition
|
218
|
+
* before(:each)/setup in order of definition
|
219
|
+
* specify
|
220
|
+
* after(:each)/setup in order of definition
|
221
|
+
* before(:each)/setup in order of definition
|
222
|
+
* specify
|
223
|
+
* after(:each)/setup in order of definition
|
224
|
+
* ...
|
225
|
+
* after(:all) in order of definition
|
226
|
+
|
227
|
+
Please note that before(:all) and after(:all) are run in their own
|
228
|
+
instance, so all instance variables they set are lost(!) and not
|
229
|
+
visible to other specifications. They are e.g. useful for setting up
|
230
|
+
database connections or starting servers.
|
231
|
+
|
232
|
+
|
233
|
+
== Shared contexts
|
234
|
+
|
235
|
+
Since version 0.9, you can define shared contexts in test/spec using
|
236
|
+
shared_context/describe_shared. These contexts are not executed on
|
237
|
+
their own, but can be included with it_should_behave_like/behaves_like
|
238
|
+
in other contexts. You can use shared contexts to structure suites
|
239
|
+
with many recurring specifications.
|
240
|
+
|
241
|
+
|
242
|
+
== specrb
|
243
|
+
|
244
|
+
Since version 0.2, test/spec features a standalone test runner called
|
245
|
+
specrb. specrb is like an extended version of testrb, Test::Unit's
|
246
|
+
test runner, but has additional options. It can be used for
|
247
|
+
plain Test::Unit suites, too.
|
248
|
+
|
249
|
+
$ specrb -a -s -n should.output
|
250
|
+
|
251
|
+
should.output
|
252
|
+
- works for print
|
253
|
+
- works for puts
|
254
|
+
- works with readline
|
255
|
+
|
256
|
+
Finished in 0.162571 seconds.
|
257
|
+
|
258
|
+
3 specifications (6 requirements), 0 failures
|
259
|
+
|
260
|
+
Run <tt>specrb --help</tt> for the usage.
|
261
|
+
|
262
|
+
|
263
|
+
== test/spec on Rails
|
264
|
+
|
265
|
+
If you want to specify your Rails applications, you can use the third-party
|
266
|
+
plugin "test/spec on Rails", which can be found at:
|
267
|
+
|
268
|
+
http://svn.techno-weenie.net/projects/plugins/test_spec_on_rails/
|
269
|
+
|
270
|
+
It features testing of model validation, redirection, output, HTTP
|
271
|
+
status, template rendering and URL generation.
|
272
|
+
|
273
|
+
|
274
|
+
== Installing with RubyGems
|
275
|
+
|
276
|
+
Since version 0.3, a Gem of test/spec is available. You can install with:
|
277
|
+
|
278
|
+
gem install test-spec
|
279
|
+
|
280
|
+
I also provide a local mirror of the gems (and development snapshots)
|
281
|
+
at my site:
|
282
|
+
|
283
|
+
gem install test-spec --source http://chneukirchen.org/releases/gems
|
284
|
+
|
285
|
+
|
286
|
+
== History
|
287
|
+
|
288
|
+
* September 29th, 2006: First public release 0.1.
|
289
|
+
|
290
|
+
* October 18th, 2006: Second public release 0.2.
|
291
|
+
* Better, module-based implementation
|
292
|
+
* Official support for FlexMock and Mocha
|
293
|
+
* More robust Should#output
|
294
|
+
* Should#_operator_
|
295
|
+
* Nested contexts
|
296
|
+
* Standalone test/spec runner, specrb
|
297
|
+
|
298
|
+
* January 24th, 2007: Third public release 0.3.
|
299
|
+
* should.be_close, should.be_an_instance_of, should.be_a_kind_of,
|
300
|
+
and should.be_nil have been deprecated. Use the dot-variants of
|
301
|
+
them. These assertions will be removed in 1.0.
|
302
|
+
* specrb -a now includes -Ilib by default for easier out-of-the-box
|
303
|
+
testing.
|
304
|
+
* Added custom shoulds.
|
305
|
+
* Added messaging/blaming.
|
306
|
+
* Added disabling of specifications.
|
307
|
+
* Small bug fixes.
|
308
|
+
* Gem available.
|
309
|
+
|
310
|
+
* June 29th, 2007: Fourth public release 0.4.
|
311
|
+
* Support for Ruby 1.8.6.
|
312
|
+
* Support describe/it/before/after RSpec 1.0 syntax.
|
313
|
+
* Allow should.raise { code_that_raises }
|
314
|
+
* Add xcontext to disable complete contexts.
|
315
|
+
* Backtraces are cleaner now.
|
316
|
+
* Mention test/spec on Rails.
|
317
|
+
* Fix small Gem bugs.
|
318
|
+
* Fix bug related to counting negated assertions.
|
319
|
+
* Fix bug in specrb.
|
320
|
+
* Allow empty xspecifys.
|
321
|
+
* Make SpecDox and RDox count empty specifications.
|
322
|
+
* Allow Kernel#context to take a superclass.
|
323
|
+
|
324
|
+
* July 2nd, 2008: Fifth public release 0.9.
|
325
|
+
* Allow should.<predicate>? as well as should.<predicate>.
|
326
|
+
* Add shared contexts.
|
327
|
+
* Nested contexts now run the
|
328
|
+
setups/teardowns/before(:all)/after(:all) of their parents.
|
329
|
+
|
330
|
+
|
331
|
+
== Contact
|
332
|
+
|
333
|
+
Please mail bugs, suggestions and patches to
|
334
|
+
<mailto:chneukirchen@gmail.com>.
|
335
|
+
|
336
|
+
Darcs repository ("darcs send" is welcome for patches):
|
337
|
+
http://chneukirchen.org/repos/testspec
|
338
|
+
|
339
|
+
|
340
|
+
== Thanks to
|
341
|
+
|
342
|
+
* Eero Saynatkari for writing <tt>should.output</tt>.
|
343
|
+
* Tuxie for writing test/spec on Rails.
|
344
|
+
* Brian Donovan for allowing alternative superclasses.
|
345
|
+
* Xavier Shay for implementing nested setups/teardowns.
|
346
|
+
* Chris Wanstrath for <tt>should.raise</tt> with a block and <tt>xcontext</tt>.
|
347
|
+
* Jean-Michel Garnier for packaging the first gem.
|
348
|
+
* Mikko Lehtonen, Jan Wikholm, Matt Mower and Michael Fellinger for
|
349
|
+
testing the gem.
|
350
|
+
* Chris McGrath for reporting a bug.
|
351
|
+
* Thomas Fuchs for script.aculo.us BDD testing which convinced me.
|
352
|
+
* Dave Astels for BDD.
|
353
|
+
* The RSpec team for API inspiration.
|
354
|
+
* Nathaniel Talbott for Test::Unit.
|
355
|
+
|
356
|
+
|
357
|
+
== Copying
|
358
|
+
|
359
|
+
Copyright (C) 2006, 2007, 2008 Christian Neukirchen <http://purl.org/net/chneukirchen>
|
360
|
+
|
361
|
+
test/spec is licensed under the same terms as Ruby itself.
|
362
|
+
|
363
|
+
Please mail bugs, feature requests or patches to the mail addresses
|
364
|
+
found above or use IRC[irc://freenode.net/#ruby-lang] to contact the
|
365
|
+
developer.
|
366
|
+
|
367
|
+
|
368
|
+
== Links
|
369
|
+
|
370
|
+
Behavior-Driven Development:: <http://behaviour-driven.org/>
|
371
|
+
RSpec:: <http://rspec.rubyforge.org/>
|
372
|
+
script.aculo.us testing:: <http://mir.aculo.us/articles/2006/08/29/bdd-style-javascript-testing>
|
373
|
+
|
374
|
+
FlexMock:: <http://onestepback.org/software/flexmock/>
|
375
|
+
Mocha:: <http://mocha.rubyforge.org/>
|
376
|
+
|
377
|
+
Christian Neukirchen:: <http://chneukirchen.org/>
|
378
|
+
|