behaviors 1.0.3 → 1.99.99
Sign up to get free protection for your applications and to get access to all the features.
- data/test/behaviors_tasks_test.rb +16 -8
- data/test/behaviors_test.rb +191 -13
- metadata +43 -50
- data/Manifest.txt +0 -9
- data/Rakefile +0 -19
- data/lib/behaviors.rb +0 -76
- data/lib/behaviors/reporttask.rb +0 -158
- data/test/tasks_test/Rakefile +0 -19
- data/test/tasks_test/lib/user.rb +0 -2
- data/test/tasks_test/test/user_test.rb +0 -17
@@ -49,10 +49,14 @@ class BehaviorsTasksTest < Test::Unit::TestCase
|
|
49
49
|
def test_that_behaviors_tasks_should_list_behavioral_definitions_for_the_classes_under_test
|
50
50
|
run_behaviors_task
|
51
51
|
user_behaviors = [
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
52
|
+
"User:",
|
53
|
+
" - should:",
|
54
|
+
" - allow age to be changed",
|
55
|
+
" - allow name to be changed",
|
56
|
+
" - given a constructed instance should:",
|
57
|
+
" - be an adult if age is 18",
|
58
|
+
" - when constructing should:",
|
59
|
+
" - set name and age accessors"
|
56
60
|
]
|
57
61
|
assert_match(/#{user_behaviors.join("\n")}/, @report)
|
58
62
|
end
|
@@ -62,10 +66,14 @@ class BehaviorsTasksTest < Test::Unit::TestCase
|
|
62
66
|
see_html_task_output_message
|
63
67
|
see_that_html_report_file_exits
|
64
68
|
user_behaviors = [
|
65
|
-
"User
|
66
|
-
"
|
67
|
-
"
|
68
|
-
"
|
69
|
+
"User",
|
70
|
+
"should",
|
71
|
+
"allow age to be changed",
|
72
|
+
"allow name to be changed",
|
73
|
+
"given a constructed instance should",
|
74
|
+
"be an adult if age is 18",
|
75
|
+
"when constructing should",
|
76
|
+
"set name and age accessors"
|
69
77
|
]
|
70
78
|
html_report_file_should_contain user_behaviors
|
71
79
|
end
|
data/test/behaviors_test.rb
CHANGED
@@ -2,49 +2,227 @@ require 'test/unit'
|
|
2
2
|
require File.expand_path(File.dirname(__FILE__)) + '/../lib/behaviors'
|
3
3
|
require 'stringio'
|
4
4
|
|
5
|
+
class Dog < Test::Unit::TestCase
|
6
|
+
extend Behaviors
|
7
|
+
attr_accessor :fed
|
8
|
+
|
9
|
+
alias_method :orig_run, :run #tuck run out of the way so DeveloperTest does not have test methods run at_exit
|
10
|
+
def run(result)
|
11
|
+
end
|
12
|
+
|
13
|
+
should 'be fed' do
|
14
|
+
@fed = true
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
5
18
|
loading_developer_test_class_stdout = StringIO.new
|
6
19
|
saved_stdout = $stdout.dup
|
7
20
|
$stdout = loading_developer_test_class_stdout
|
8
21
|
|
9
|
-
class DeveloperTest
|
22
|
+
class DeveloperTest < Test::Unit::TestCase
|
10
23
|
extend Behaviors
|
11
|
-
attr_accessor :flunk_msg, :tested_code
|
12
24
|
|
13
|
-
|
14
|
-
|
25
|
+
attr_accessor :tests_code, :studies, :work_snack, :home_snack,
|
26
|
+
:study_atmosphere, :rest_atmosphere, :unlimited_power,
|
27
|
+
:work_atmosphere, :has_been_setup
|
28
|
+
|
29
|
+
|
30
|
+
alias_method :orig_run, :run #tuck run out of the way so DeveloperTest does not have test methods run at_exit
|
31
|
+
def run(result)
|
32
|
+
end
|
33
|
+
|
34
|
+
def setup
|
35
|
+
@snack = 'yogurt'
|
36
|
+
end
|
37
|
+
|
38
|
+
def have_unlimited_power
|
39
|
+
@unlimited_power = true
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'developer at home' do
|
43
|
+
setup do
|
44
|
+
@noise_level = 'quiet'
|
45
|
+
end
|
46
|
+
|
47
|
+
should 'study' do
|
48
|
+
@studies = true
|
49
|
+
@home_snack = @snack
|
50
|
+
@study_atmosphere = @noise_level
|
51
|
+
end
|
52
|
+
|
53
|
+
should 'rest' do
|
54
|
+
@rest_atmosphere = @noise_level
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
context 'developer at work' do
|
59
|
+
should 'test their code' do
|
60
|
+
@has_been_setup = @setup
|
61
|
+
@tests_code = true
|
62
|
+
@work_snack = @snack
|
63
|
+
@noise_level ||= nil
|
64
|
+
@work_atmosphere = @noise_level
|
65
|
+
have_unlimited_power
|
66
|
+
end
|
67
|
+
|
68
|
+
setup do
|
69
|
+
@setup = true
|
70
|
+
end
|
71
|
+
|
72
|
+
should 'go to meetings'
|
15
73
|
end
|
16
|
-
|
74
|
+
|
17
75
|
end
|
18
76
|
|
19
77
|
$stdout = saved_stdout
|
20
78
|
loading_developer_test_class_stdout.rewind
|
21
79
|
$loading_developer_test_class_output = loading_developer_test_class_stdout.read
|
22
80
|
|
23
|
-
class BehaviorsTest < Test::Unit::TestCase
|
24
81
|
|
82
|
+
class BehaviorsTest < Test::Unit::TestCase
|
25
83
|
|
26
84
|
def setup
|
27
|
-
@
|
28
|
-
assert_nil @target.tested_code, "block called too early"
|
85
|
+
@developer_test_suite = DeveloperTest.suite
|
29
86
|
end
|
30
87
|
|
31
88
|
#
|
32
89
|
# TESTS
|
33
90
|
#
|
34
91
|
def test_should_called_with_a_block_defines_a_test
|
35
|
-
|
92
|
+
at_work_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at work should test their code'}
|
93
|
+
at_home_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at home should study'}
|
36
94
|
|
37
|
-
|
95
|
+
assert_nil at_work_test.tests_code, 'should be nil until test method called'
|
96
|
+
assert_nil at_home_test.studies, 'should be nil until test method called'
|
38
97
|
|
39
|
-
|
98
|
+
at_work_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
99
|
+
at_home_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
100
|
+
|
101
|
+
assert at_work_test.tests_code, 'should be true after test method called'
|
102
|
+
assert at_home_test.studies, 'should be true after test method called'
|
40
103
|
end
|
41
104
|
|
42
105
|
def test_should_called_without_a_block_does_not_create_a_test_method
|
43
|
-
assert !@
|
106
|
+
assert !@developer_test_suite.tests.any? {|test| test.method_name == 'test should_go to meetings' }, 'should not have defined test method'
|
107
|
+
end
|
108
|
+
|
109
|
+
def test_contexts_will_share_test_case_setup
|
110
|
+
at_work_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at work should test their code'}
|
111
|
+
at_home_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at home should study'}
|
112
|
+
|
113
|
+
assert_nil at_work_test.work_snack, 'work snack should not be defined'
|
114
|
+
assert_nil at_home_test.home_snack, 'home snack should not be defined'
|
115
|
+
|
116
|
+
at_work_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
117
|
+
at_home_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
118
|
+
|
119
|
+
assert_equal 'yogurt', at_work_test.work_snack, 'wrong home snack'
|
120
|
+
assert_equal 'yogurt', at_home_test.home_snack, 'wrong home snack'
|
121
|
+
end
|
122
|
+
|
123
|
+
def test_contexts_can_make_calls_to_helpers_defined_outside_of_the_context
|
124
|
+
at_work_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at work should test their code'}
|
125
|
+
|
126
|
+
assert_nil at_work_test.unlimited_power, 'should not have unlimited power yet'
|
127
|
+
|
128
|
+
at_work_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
129
|
+
assert at_work_test.unlimited_power, 'should have unlimited power'
|
130
|
+
end
|
131
|
+
|
132
|
+
def test_contexts_can_have_their_own_setup_that_will_be_invoked_before_each_should
|
133
|
+
at_home_study_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at home should study'}
|
134
|
+
at_home_rest_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at home should rest'}
|
135
|
+
|
136
|
+
assert_nil at_home_study_test.study_atmosphere, 'study atmosphere should not be defined'
|
137
|
+
assert_nil at_home_rest_test.rest_atmosphere, 'rest atmosphere should not be defined'
|
138
|
+
|
139
|
+
at_home_study_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
140
|
+
at_home_rest_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
141
|
+
|
142
|
+
assert_equal 'quiet', at_home_study_test.study_atmosphere, 'wrong study atmosphere'
|
143
|
+
assert_equal 'quiet', at_home_rest_test.rest_atmosphere, 'wrong rest atmosphere'
|
144
|
+
end
|
145
|
+
|
146
|
+
def test_setup_can_be_placed_anywhere_in_a_context
|
147
|
+
at_work_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at work should test their code'}
|
148
|
+
|
149
|
+
assert_nil at_work_test.unlimited_power, 'should not have unlimited power yet'
|
150
|
+
|
151
|
+
at_work_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
152
|
+
assert at_work_test.has_been_setup, 'should have called setup'
|
153
|
+
end
|
154
|
+
|
155
|
+
def test_a_context_does_get_polluted_with_instance_variables_from_another_context
|
156
|
+
at_home_study_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at home should study'}
|
157
|
+
assert_nil at_home_study_test.study_atmosphere, 'study atmosphere should not be defined'
|
158
|
+
|
159
|
+
at_home_study_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
160
|
+
assert_equal 'quiet', at_home_study_test.study_atmosphere, 'wrong study atmosphere'
|
161
|
+
|
162
|
+
|
163
|
+
at_work_test = @developer_test_suite.tests.find {|test| test.method_name == 'test developer at work should test their code'}
|
164
|
+
assert_nil at_work_test.work_atmosphere, 'work atmosphere should not be defined'
|
165
|
+
|
166
|
+
at_work_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
167
|
+
assert_nil at_work_test.work_atmosphere, 'work atmosphere should not be defined'
|
44
168
|
end
|
45
169
|
|
46
170
|
def test_should_called_without_a_block_will_give_unimplemented_output_when_class_loads
|
47
|
-
unimplemented_output =
|
171
|
+
unimplemented_output = 'UNIMPLEMENTED CASE: Developer should go to meetings'
|
48
172
|
assert_match(/#{unimplemented_output}/, $loading_developer_test_class_output)
|
49
173
|
end
|
174
|
+
|
175
|
+
def test_can_use_shoulds_without_a_context
|
176
|
+
dog_suite = Dog.suite
|
177
|
+
fed_test = dog_suite.tests.find {|test| test.method_name == 'test should be fed'}
|
178
|
+
assert_nil fed_test.fed, 'fed should not be defined yet'
|
179
|
+
fed_test.orig_run(Test::Unit::TestResult.new) {|result,progress_block|}
|
180
|
+
assert fed_test.fed, 'fed should be true'
|
181
|
+
end
|
182
|
+
|
183
|
+
def test_contexts_without_a_block_will_raise
|
184
|
+
assert_not_nil @@context_without_block_error, 'should have thrown an error'
|
185
|
+
assert_equal RuntimeError, @@context_without_block_error.class, 'wrong error type'
|
186
|
+
assert_match(/context: 'this will not work' called without a block/, @@context_without_block_error.message, 'wrong error message')
|
187
|
+
end
|
188
|
+
|
189
|
+
def test_defining_two_setups_in_context_will_raise
|
190
|
+
assert_not_nil @@context_without_block_error, 'should have thrown an error'
|
191
|
+
assert_equal RuntimeError, @@two_setups_error.class, 'wrong error type'
|
192
|
+
assert_equal "Can't define two setups within one context", @@two_setups_error.message
|
193
|
+
end
|
194
|
+
|
195
|
+
begin
|
196
|
+
class BoomBoom < Test::Unit::TestCase
|
197
|
+
extend Behaviors
|
198
|
+
|
199
|
+
alias_method :orig_run, :run #tuck run out of the way so Test does not have test methods run at_exit
|
200
|
+
def run(result)
|
201
|
+
end
|
202
|
+
|
203
|
+
context 'this will not work'
|
204
|
+
end
|
205
|
+
rescue => err
|
206
|
+
@@context_without_block_error = err
|
207
|
+
end
|
208
|
+
|
209
|
+
begin
|
210
|
+
class TwoSetups < Test::Unit::TestCase
|
211
|
+
extend Behaviors
|
212
|
+
|
213
|
+
alias_method :orig_run, :run #tuck run out of the way so Test does not have test methods run at_exit
|
214
|
+
def run(result)
|
215
|
+
end
|
216
|
+
|
217
|
+
context 'two setups will raise' do
|
218
|
+
setup do
|
219
|
+
end
|
220
|
+
setup do
|
221
|
+
end
|
222
|
+
end
|
223
|
+
end
|
224
|
+
rescue => err
|
225
|
+
@@two_setups_error = err
|
226
|
+
end
|
227
|
+
|
50
228
|
end
|
metadata
CHANGED
@@ -1,63 +1,56 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
|
-
rubygems_version: 0.9.0
|
3
|
-
specification_version: 1
|
4
2
|
name: behaviors
|
5
3
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.
|
7
|
-
date: 2007-01-14 00:00:00 -05:00
|
8
|
-
summary: behavior-driven unit test helper
|
9
|
-
require_paths:
|
10
|
-
- lib
|
11
|
-
email: dev@atomicobject.com
|
12
|
-
homepage: http://behaviors.rubyforge.org
|
13
|
-
rubyforge_project: behaviors
|
14
|
-
description: Behaviors allows for Test::Unit test case methods to be defined as human-readable descriptions of program behavior. It also provides Rake tasks to list the behaviors of your project.
|
15
|
-
autorequire:
|
16
|
-
default_executable:
|
17
|
-
bindir: bin
|
18
|
-
has_rdoc: true
|
19
|
-
required_ruby_version: !ruby/object:Gem::Version::Requirement
|
20
|
-
requirements:
|
21
|
-
- - ">"
|
22
|
-
- !ruby/object:Gem::Version
|
23
|
-
version: 0.0.0
|
24
|
-
version:
|
4
|
+
version: 1.99.99
|
25
5
|
platform: ruby
|
26
|
-
signing_key:
|
27
|
-
cert_chain:
|
28
|
-
post_install_message:
|
29
6
|
authors:
|
30
|
-
- Atomic Object
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
- lib/behaviors.rb
|
35
|
-
- lib/behaviors/reporttask.rb
|
36
|
-
- test/behaviors_tasks_test.rb
|
37
|
-
- test/behaviors_test.rb
|
38
|
-
- test/tasks_test/lib/user.rb
|
39
|
-
- test/tasks_test/Rakefile
|
40
|
-
- test/tasks_test/test/user_test.rb
|
41
|
-
test_files:
|
42
|
-
- test/behaviors_tasks_test.rb
|
43
|
-
- test/behaviors_test.rb
|
44
|
-
rdoc_options: []
|
7
|
+
- Atomic Object
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
45
11
|
|
46
|
-
|
12
|
+
date: 2009-12-01 00:00:00 -05:00
|
13
|
+
default_executable:
|
14
|
+
dependencies: []
|
47
15
|
|
16
|
+
description: DEPRECATED! behaviors will no longer be maintained. We recommend switching to shoulda or rspec
|
17
|
+
email: github@atomicobject.com
|
48
18
|
executables: []
|
49
19
|
|
50
20
|
extensions: []
|
51
21
|
|
22
|
+
extra_rdoc_files: []
|
23
|
+
|
24
|
+
files: []
|
25
|
+
|
26
|
+
has_rdoc: true
|
27
|
+
homepage: http://atomicobject.github.com
|
28
|
+
licenses: []
|
29
|
+
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options:
|
32
|
+
- --charset=UTF-8
|
33
|
+
require_paths:
|
34
|
+
- lib
|
35
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: "0"
|
40
|
+
version:
|
41
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - ">="
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: "0"
|
46
|
+
version:
|
52
47
|
requirements: []
|
53
48
|
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
version: 1.1.7
|
63
|
-
version:
|
49
|
+
rubyforge_project:
|
50
|
+
rubygems_version: 1.3.5
|
51
|
+
signing_key:
|
52
|
+
specification_version: 3
|
53
|
+
summary: behavior-driven unit test helper. DEPRECATED! Use rspec or shoulda instead
|
54
|
+
test_files:
|
55
|
+
- test/behaviors_tasks_test.rb
|
56
|
+
- test/behaviors_test.rb
|
data/Manifest.txt
DELETED
data/Rakefile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rubygems'
|
3
|
-
require 'hoe'
|
4
|
-
|
5
|
-
Hoe.new('behaviors','1.0.3') do |p|
|
6
|
-
p.author = "Atomic Object LLC"
|
7
|
-
p.email = "dev@atomicobject.com"
|
8
|
-
p.url = "http://behaviors.rubyforge.org"
|
9
|
-
p.summary = "behavior-driven unit test helper"
|
10
|
-
p.description = <<-EOS
|
11
|
-
Behaviors allows for Test::Unit test case methods to be defined as
|
12
|
-
human-readable descriptions of program behavior. It also provides
|
13
|
-
Rake tasks to list the behaviors of your project.
|
14
|
-
EOS
|
15
|
-
p.test_globs = ['test/*_test.rb']
|
16
|
-
|
17
|
-
p.changes = <<-EOS
|
18
|
-
EOS
|
19
|
-
end
|
data/lib/behaviors.rb
DELETED
@@ -1,76 +0,0 @@
|
|
1
|
-
=begin rdoc
|
2
|
-
= Usage
|
3
|
-
Behaviors provides a single method: should.
|
4
|
-
|
5
|
-
Instead of naming test methods like:
|
6
|
-
|
7
|
-
def test_something
|
8
|
-
end
|
9
|
-
|
10
|
-
You declare test methods like:
|
11
|
-
|
12
|
-
should "perform action" do
|
13
|
-
end
|
14
|
-
|
15
|
-
You may omit the body of a <tt>should</tt> method to describe unimplemented behavior.
|
16
|
-
|
17
|
-
should "perform other action"
|
18
|
-
|
19
|
-
When you run your unit tests, empty <tt>should</tt> methods will appear as an 'UNIMPLEMENTED CASE' along with the described behavior.
|
20
|
-
This is useful for sketching out planned behavior quickly.
|
21
|
-
|
22
|
-
Simply <tt>extend Behaviors</tt> in your <tt>TestCase</tt> to start using behaviors.
|
23
|
-
|
24
|
-
require 'test/unit'
|
25
|
-
require 'behaviors'
|
26
|
-
require 'user'
|
27
|
-
|
28
|
-
class UserTest < Test::Unit::TestCase
|
29
|
-
extend Behaviors
|
30
|
-
...
|
31
|
-
end
|
32
|
-
|
33
|
-
= Motivation
|
34
|
-
Test methods typically focus on the name of the method under test instead of its behavior.
|
35
|
-
Creating test methods with <tt>should</tt> statements focuses on the behavior of an object.
|
36
|
-
This helps you to think about the role of the object under test.
|
37
|
-
|
38
|
-
Using a behavior-driven approach prevents the danger in assuming a one-to-one mapping of method names to
|
39
|
-
test method names.
|
40
|
-
As always, you get the most value by writing the tests first.
|
41
|
-
|
42
|
-
For a more complete BDD framework, try RSpec http://rspec.rubyforge.org/
|
43
|
-
|
44
|
-
= Rake tasks
|
45
|
-
|
46
|
-
You can define a <tt>Behaviors::ReportTask</tt> in your <tt>Rakefile</tt> to generate rake tasks that
|
47
|
-
summarize the behavior of your project.
|
48
|
-
|
49
|
-
These tasks are named <tt>behaviors</tt> and <tt>behaviors_html</tt>. They will output to the
|
50
|
-
console or an html file in the <tt>doc</tt> directory with a list all of your <tt>should</tt> tests.
|
51
|
-
Behaviors::ReportTask.new do |t|
|
52
|
-
t.pattern = 'test/**/*_test.rb'
|
53
|
-
end
|
54
|
-
|
55
|
-
You may also initialize the <tt>ReportTask</tt> with a custom name to associate with a particular suite of tests.
|
56
|
-
Behaviors::ReportTask.new(:widget_subsystem) do |t|
|
57
|
-
t.pattern = 'test/widgets/*_test.rb'
|
58
|
-
end
|
59
|
-
|
60
|
-
The html report will be placed in the <tt>doc</tt> directory by default.
|
61
|
-
You can override this default by setting the <tt>html_dir</tt> in the <tt>ReportTask</tt>.
|
62
|
-
Behaviors::ReportTask.new do |t|
|
63
|
-
t.pattern = 'test/**/*_test.rb'
|
64
|
-
t.html_dir = 'behaviors_html_reports'
|
65
|
-
end
|
66
|
-
=end
|
67
|
-
module Behaviors
|
68
|
-
def should(behave,&block)
|
69
|
-
mname = "test_should_#{behave}"
|
70
|
-
if block
|
71
|
-
define_method mname, &block
|
72
|
-
else
|
73
|
-
puts ">>> UNIMPLEMENTED CASE: #{name.sub(/Test$/,'')} should #{behave}"
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
data/lib/behaviors/reporttask.rb
DELETED
@@ -1,158 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/tasklib'
|
3
|
-
|
4
|
-
module Behaviors
|
5
|
-
include Rake
|
6
|
-
|
7
|
-
class ReportTask < TaskLib
|
8
|
-
attr_accessor :pattern
|
9
|
-
attr_accessor :html_dir
|
10
|
-
|
11
|
-
def initialize(name=:behaviors)
|
12
|
-
@name = name
|
13
|
-
@html_dir = 'doc'
|
14
|
-
yield self if block_given?
|
15
|
-
define
|
16
|
-
end
|
17
|
-
|
18
|
-
def define
|
19
|
-
desc "List behavioral definitions for the classes specified (use for=<regexp> to further limit files included in report)"
|
20
|
-
task @name do
|
21
|
-
specifications.each do |spec|
|
22
|
-
puts "#{spec.name} should:\n"
|
23
|
-
spec.requirements.each do |req|
|
24
|
-
puts " - #{req}"
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
desc "Generate html report of behavioral definitions for the classes specified (use for=<regexp> to further limit files included in report)"
|
30
|
-
task "#{@name}_html" do
|
31
|
-
require 'erb'
|
32
|
-
txt =<<-EOS
|
33
|
-
<html>
|
34
|
-
<head>
|
35
|
-
<style>
|
36
|
-
|
37
|
-
div.title
|
38
|
-
{
|
39
|
-
width: 600px;
|
40
|
-
font: bold 14pt trebuchet ms;
|
41
|
-
}
|
42
|
-
|
43
|
-
div.specification
|
44
|
-
{
|
45
|
-
font: bold 12pt trebuchet ms;
|
46
|
-
border: solid 1px black;
|
47
|
-
width: 600px;
|
48
|
-
padding: 5px;
|
49
|
-
margin: 5px;
|
50
|
-
}
|
51
|
-
|
52
|
-
ul.requirements
|
53
|
-
{
|
54
|
-
font: normal 11pt verdana;
|
55
|
-
padding-left: 0;
|
56
|
-
margin-left: 0;
|
57
|
-
border-bottom: 1px solid gray;
|
58
|
-
width: 600px;
|
59
|
-
}
|
60
|
-
|
61
|
-
ul.requirements li
|
62
|
-
{
|
63
|
-
list-style: none;
|
64
|
-
margin: 0;
|
65
|
-
padding: 0.25em;
|
66
|
-
border-top: 1px solid gray;
|
67
|
-
}
|
68
|
-
</style>
|
69
|
-
</head>
|
70
|
-
<body>
|
71
|
-
<div class="title">Specifications</div>
|
72
|
-
<% specifications.each do |spec| %>
|
73
|
-
<div class="specification">
|
74
|
-
<%= spec.name %> should:
|
75
|
-
<ul class="requirements">
|
76
|
-
<% spec.requirements.each do |req| %>
|
77
|
-
<li><%= req %></li>
|
78
|
-
<% end %>
|
79
|
-
</ul>
|
80
|
-
</div>
|
81
|
-
<% end %>
|
82
|
-
</body>
|
83
|
-
</html>
|
84
|
-
EOS
|
85
|
-
output_dir = File.expand_path(@html_dir)
|
86
|
-
mkdir_p output_dir
|
87
|
-
output_filename = output_dir + "/behaviors.html"
|
88
|
-
File.open(output_filename,"w") do |f|
|
89
|
-
f.write ERB.new(txt).result(binding)
|
90
|
-
end
|
91
|
-
puts "(Wrote #{output_filename})"
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
private
|
96
|
-
def test_files
|
97
|
-
test_list = FileList[@pattern]
|
98
|
-
if ENV['for']
|
99
|
-
test_list = test_list.grep(/#{ENV['for']}/i)
|
100
|
-
end
|
101
|
-
test_list
|
102
|
-
end
|
103
|
-
|
104
|
-
def specifications
|
105
|
-
test_files.map do |file|
|
106
|
-
spec = OpenStruct.new
|
107
|
-
m = %r".*/([^/].*)_test.rb".match(file)
|
108
|
-
class_name = titleize(m[1]) if m[1]
|
109
|
-
spec.name = class_name
|
110
|
-
spec.requirements = []
|
111
|
-
File::readlines(file).each do |line|
|
112
|
-
if line =~ /^\s*should\s+\(?\s*["'](.*)["']/
|
113
|
-
spec.requirements << $1
|
114
|
-
end
|
115
|
-
end
|
116
|
-
spec
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
############################################################
|
121
|
-
# STOLEN FROM inflector.rb
|
122
|
-
############################################################
|
123
|
-
#--
|
124
|
-
# Copyright (c) 2005 David Heinemeier Hansson
|
125
|
-
#
|
126
|
-
# Permission is hereby granted, free of charge, to any person obtaining
|
127
|
-
# a copy of this software and associated documentation files (the
|
128
|
-
# "Software"), to deal in the Software without restriction, including
|
129
|
-
# without limitation the rights to use, copy, modify, merge, publish,
|
130
|
-
# distribute, sublicense, and/or sell copies of the Software, and to
|
131
|
-
# permit persons to whom the Software is furnished to do so, subject to
|
132
|
-
# the following conditions:
|
133
|
-
#
|
134
|
-
# The above copyright notice and this permission notice shall be
|
135
|
-
# included in all copies or substantial portions of the Software.
|
136
|
-
#
|
137
|
-
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
138
|
-
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
139
|
-
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
140
|
-
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
141
|
-
# LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
142
|
-
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
143
|
-
# WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
144
|
-
#++
|
145
|
-
def titleize(word)
|
146
|
-
humanize(underscore(word)).gsub(/\b([a-z])/) { $1.capitalize }
|
147
|
-
end
|
148
|
-
|
149
|
-
def underscore(camel_cased_word) camel_cased_word.to_s.gsub(/::/, '/').
|
150
|
-
gsub(/([A-Z]+)([A-Z][a-z])/,'\1_\2').gsub(/([a-z\d])([A-Z])/,'\1_\2').tr("-", "_").downcase
|
151
|
-
end
|
152
|
-
|
153
|
-
def humanize(lower_case_and_underscored_word)
|
154
|
-
lower_case_and_underscored_word.to_s.gsub(/_id$/, "").gsub(/_/, " ").capitalize
|
155
|
-
end
|
156
|
-
|
157
|
-
end
|
158
|
-
end
|
data/test/tasks_test/Rakefile
DELETED
@@ -1,19 +0,0 @@
|
|
1
|
-
require 'rake'
|
2
|
-
require 'rake/testtask'
|
3
|
-
|
4
|
-
here = File.expand_path(File.dirname(__FILE__))
|
5
|
-
require "#{here}/../../lib/behaviors/reporttask"
|
6
|
-
|
7
|
-
desc 'Default: run unit tests.'
|
8
|
-
task :default => :test
|
9
|
-
|
10
|
-
Rake::TestTask.new(:test) do |t|
|
11
|
-
t.libs << "#{here}/../../lib"
|
12
|
-
t.pattern = 'test/**/*_test.rb'
|
13
|
-
t.verbose = true
|
14
|
-
end
|
15
|
-
|
16
|
-
Behaviors::ReportTask.new(:behaviors) do |t|
|
17
|
-
t.pattern = 'test/**/*_test.rb'
|
18
|
-
t.html_dir = 'behaviors_doc'
|
19
|
-
end
|
data/test/tasks_test/lib/user.rb
DELETED
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'test/unit'
|
2
|
-
require 'behaviors'
|
3
|
-
|
4
|
-
require 'user'
|
5
|
-
|
6
|
-
class UserTest < Test::Unit::TestCase
|
7
|
-
extend Behaviors
|
8
|
-
|
9
|
-
def setup
|
10
|
-
end
|
11
|
-
|
12
|
-
should "be able set user name and age during construction"
|
13
|
-
should "be able to get user name and age"
|
14
|
-
should "be able to ask if a user is an adult"
|
15
|
-
def test_DELETEME
|
16
|
-
end
|
17
|
-
end
|