kintama 0.1.9 → 0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +2 -2
- data/lib/kintama.rb +26 -12
- data/lib/kintama/assertions.rb +40 -1
- data/lib/kintama/context.rb +65 -50
- data/lib/kintama/mocha.rb +32 -10
- data/lib/kintama/no_conflict.rb +2 -0
- data/lib/kintama/reporter.rb +11 -10
- data/lib/kintama/runnable.rb +2 -2
- data/lib/kintama/runner.rb +5 -5
- data/lib/kintama/test.rb +2 -2
- data/test/integration/automatic_running_test.rb +22 -0
- data/test/integration/line_based_running_test.rb +129 -0
- data/test/reporters/base_reporter_test.rb +31 -101
- data/test/reporters/inline_reporter_test.rb +23 -35
- data/test/reporters/verbose_reporter_test.rb +78 -76
- data/test/test_helper.rb +159 -2
- data/test/{assertions_test.rb → unit/assertions_test.rb} +54 -5
- data/test/unit/context_test.rb +15 -0
- data/test/unit/runner_test.rb +87 -0
- data/test/{test_and_subcontext_access_test.rb → unit/test_and_subcontext_access_test.rb} +6 -33
- data/test/usage/01_basic_usage_test.rb +131 -0
- data/test/usage/02_setup_test.rb +98 -0
- data/test/usage/03_teardown_test.rb +121 -0
- data/test/usage/04_pending_tests_test.rb +16 -0
- data/test/usage/05_aliases_test.rb +73 -0
- data/test/usage/06_defining_methods_in_tests_test.rb +202 -0
- data/test/usage/07_exceptions_test.rb +42 -0
- data/test/usage/08_start_and_finish_test.rb +261 -0
- data/test/usage/09_expectations_and_mocking_test.rb +85 -0
- data/test/usage/10_let_and_subject_test.rb +134 -0
- data/test/usage/11_matcher_test.rb +148 -0
- data/test/usage/12_action_test.rb +118 -0
- metadata +55 -48
- data/test/aliases_test.rb +0 -26
- data/test/automatic_running_test.rb +0 -45
- data/test/exceptions_test.rb +0 -40
- data/test/kintama_test.rb +0 -114
- data/test/line_based_running_test.rb +0 -143
- data/test/matcher_test.rb +0 -80
- data/test/method_behaviour_test.rb +0 -176
- data/test/pending_test_and_context.rb +0 -20
- data/test/setup_test.rb +0 -107
- data/test/start_and_finish_test.rb +0 -94
- data/test/teardown_test.rb +0 -106
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
require 'kintama/mocha'
|
3
|
+
|
4
|
+
class ExpectationsAndMockingTest < KintamaIntegrationTest
|
5
|
+
|
6
|
+
def setup
|
7
|
+
super
|
8
|
+
# This is normally called automatically when requiring 'kintama/mocha'
|
9
|
+
# but in these tests we totally reset Kintama, and so we need to
|
10
|
+
# ensure that the mocha integration is loaded properly.
|
11
|
+
Kintama::Mocha.setup
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_should_allow_setting_of_expectations_in_tests
|
15
|
+
context "Given an expectation" do
|
16
|
+
setup do
|
17
|
+
@thing = stub('thing')
|
18
|
+
end
|
19
|
+
|
20
|
+
expect "blah to be called" do
|
21
|
+
@thing.expects(:blah)
|
22
|
+
@thing.blah
|
23
|
+
end
|
24
|
+
end.
|
25
|
+
should_output(%{
|
26
|
+
Given an expectation
|
27
|
+
expect blah to be called
|
28
|
+
}).
|
29
|
+
and_pass
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_should_report_failed_expectations_as_failures
|
33
|
+
context "Given an expectation" do
|
34
|
+
setup do
|
35
|
+
@thing = stub('thing')
|
36
|
+
end
|
37
|
+
|
38
|
+
expect "blah to be called" do
|
39
|
+
@thing.expects(:blah)
|
40
|
+
end
|
41
|
+
end.
|
42
|
+
should_fail.
|
43
|
+
with_failure(%{
|
44
|
+
unsatisfied expectations:
|
45
|
+
- expected exactly once, invoked never: #<Mock:thing>.blah
|
46
|
+
})
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_should_set_expectations_before_action_is_called
|
50
|
+
context "Given an action" do
|
51
|
+
setup do
|
52
|
+
@thing = stub('thing')
|
53
|
+
end
|
54
|
+
|
55
|
+
action do
|
56
|
+
@thing.go
|
57
|
+
end
|
58
|
+
|
59
|
+
expect "go to be called on thing" do
|
60
|
+
@thing.expects(:go)
|
61
|
+
end
|
62
|
+
end.
|
63
|
+
should_run_tests(1).
|
64
|
+
and_pass
|
65
|
+
end
|
66
|
+
|
67
|
+
def test_should_not_set_expectations_for_normal_tests_defined_near_the_expect
|
68
|
+
context "Given an expectation" do
|
69
|
+
setup do
|
70
|
+
@thing = [1,2,3]
|
71
|
+
end
|
72
|
+
|
73
|
+
expect "blah to be called" do
|
74
|
+
@thing.expects(:join)
|
75
|
+
@thing.join
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should retain original behaviour in other tests" do
|
79
|
+
assert_equal "123", @thing.join
|
80
|
+
end
|
81
|
+
end.
|
82
|
+
should_run_tests(2).
|
83
|
+
and_pass
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class LetAndSubjectTest < KintamaIntegrationTest
|
4
|
+
|
5
|
+
def test_let_should_return_value_of_block_when_called_in_tests
|
6
|
+
context "Defining a `let` attribute with a given name in a context" do
|
7
|
+
let(:thing) do
|
8
|
+
"a thing"
|
9
|
+
end
|
10
|
+
|
11
|
+
should "allow that attribute to be called as a method within tests" do
|
12
|
+
assert_equal "a thing", thing
|
13
|
+
end
|
14
|
+
end.
|
15
|
+
should_run_tests(1).
|
16
|
+
and_pass
|
17
|
+
end
|
18
|
+
|
19
|
+
def test_let_should_return_the_same_instance_within_a_test
|
20
|
+
context "Defining a `let` attribute in a context" do
|
21
|
+
let(:thing) do
|
22
|
+
Object.new
|
23
|
+
end
|
24
|
+
|
25
|
+
should "memoize the returned object within a test" do
|
26
|
+
instance_a = thing()
|
27
|
+
instance_b = thing()
|
28
|
+
assert_equal instance_a.object_id, instance_b.object_id
|
29
|
+
end
|
30
|
+
end.
|
31
|
+
should_run_tests(1).
|
32
|
+
and_pass
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_let_should_return_the_same_instance_within_a_test_and_its_setup
|
36
|
+
context "Defining a `let` attribute in a context" do
|
37
|
+
let(:thing) do
|
38
|
+
Object.new
|
39
|
+
end
|
40
|
+
|
41
|
+
setup do
|
42
|
+
$object_id = thing.object_id
|
43
|
+
end
|
44
|
+
|
45
|
+
should "memoize the returned object between setup and test" do
|
46
|
+
assert $object_id && $object_id == thing.object_id
|
47
|
+
end
|
48
|
+
end.
|
49
|
+
should_run_tests(1).
|
50
|
+
and_pass
|
51
|
+
end
|
52
|
+
|
53
|
+
def test_let_should_return_different_instances_in_different_tests
|
54
|
+
context "Defining a `let` attribute in a context" do
|
55
|
+
let(:thing) do
|
56
|
+
Object.new
|
57
|
+
end
|
58
|
+
|
59
|
+
should "return a one instance in one test" do
|
60
|
+
$object_id = thing.object_id
|
61
|
+
end
|
62
|
+
|
63
|
+
should "return some other instance in a different test" do
|
64
|
+
assert $object_id && $object_id != thing.object_id
|
65
|
+
end
|
66
|
+
end.
|
67
|
+
should_run_tests(2).
|
68
|
+
and_pass
|
69
|
+
end
|
70
|
+
|
71
|
+
def test_let_methods_should_be_callable_from_other_let_methods
|
72
|
+
context "Defining a `let` attribute in a context" do
|
73
|
+
let(:alpha) do
|
74
|
+
123
|
75
|
+
end
|
76
|
+
|
77
|
+
let(:beta) do
|
78
|
+
alpha == 123
|
79
|
+
end
|
80
|
+
|
81
|
+
should "allow one `let` attribute to be referenced from another one" do
|
82
|
+
assert beta
|
83
|
+
end
|
84
|
+
end.
|
85
|
+
should_run_tests(1).
|
86
|
+
and_pass
|
87
|
+
end
|
88
|
+
|
89
|
+
def test_subject_should_work_just_like_lets
|
90
|
+
$object_id_in_test_one = nil
|
91
|
+
$object_id_in_test_two = nil
|
92
|
+
|
93
|
+
context "Defining a `subject` attribute in a context" do
|
94
|
+
subject do
|
95
|
+
Object.new
|
96
|
+
end
|
97
|
+
|
98
|
+
should "return one instance in one test" do
|
99
|
+
$object_id_in_test_one = subject.object_id
|
100
|
+
if $object_id_in_test_two # this test might run first
|
101
|
+
assert_not_equal $object_id_in_test_one, $object_id_in_test_two, "object ids should be different between tests"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
should "return a different instance in a different test" do
|
106
|
+
$object_id_in_test_two = subject.object_id
|
107
|
+
if $object_id_in_test_one # or this test might run first
|
108
|
+
assert_not_equal $object_id_in_test_one, $object_id_in_test_two, "object ids should be different between tests"
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end.
|
112
|
+
should_run_tests(2).
|
113
|
+
and_pass
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_should_use_a_single_instance_of_the_subject_within_a_test
|
117
|
+
context "Given a context with a subject" do
|
118
|
+
subject do
|
119
|
+
Array.new
|
120
|
+
end
|
121
|
+
|
122
|
+
should "allow me to poke around with subject like it was a variable" do
|
123
|
+
subject << 1
|
124
|
+
assert_equal [1], subject
|
125
|
+
end
|
126
|
+
|
127
|
+
should "now be empty again because it's a new instance" do
|
128
|
+
assert subject.empty?
|
129
|
+
end
|
130
|
+
end.
|
131
|
+
should_run_tests(2).
|
132
|
+
and_pass
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,148 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class MatcherTest < KintamaIntegrationTest
|
4
|
+
|
5
|
+
# As well as defining tests using blocks (see Basic Usage),
|
6
|
+
# the `should` method can define tests by accepting instances
|
7
|
+
# of "matcher" classes.
|
8
|
+
def test_should_allow_use_of_matchers_within_contexts
|
9
|
+
context "The number 123" do
|
10
|
+
subject do
|
11
|
+
123
|
12
|
+
end
|
13
|
+
|
14
|
+
should EqualMatcher.new(123)
|
15
|
+
end.
|
16
|
+
should_run_tests(1).
|
17
|
+
and_pass
|
18
|
+
end
|
19
|
+
|
20
|
+
# A matcher is just an object that responds to four methods:
|
21
|
+
#
|
22
|
+
# * `matches?(provided_value)`, which will be called with the `subject` object
|
23
|
+
# as the argument. This is where you can compare aspects of the subject
|
24
|
+
# with some expected value or criteria. It should return true or false.
|
25
|
+
#
|
26
|
+
# * `description`, which should return a String to form part of the test name
|
27
|
+
#
|
28
|
+
# * `failure_message`, which returns a String describing what happened if
|
29
|
+
# `matches?` returned false
|
30
|
+
#
|
31
|
+
# * `negative_failure_message`, which returns a String describing what
|
32
|
+
# happened if the matcher was being used in a negated form (see below)
|
33
|
+
#
|
34
|
+
# This is an example Matcher object which can check the equality of the
|
35
|
+
# subject against a given value. It's used above, and in the tests below.
|
36
|
+
class EqualMatcher
|
37
|
+
def initialize(expected)
|
38
|
+
@expected = expected
|
39
|
+
end
|
40
|
+
|
41
|
+
def matches?(provided_value)
|
42
|
+
@actual = provided_value
|
43
|
+
@actual == @expected
|
44
|
+
end
|
45
|
+
|
46
|
+
def description
|
47
|
+
"be equal to #{@expected.inspect}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def failure_message
|
51
|
+
"Expected #{@expected}, but got #{@actual}"
|
52
|
+
end
|
53
|
+
|
54
|
+
def negative_failure_message
|
55
|
+
"Didn't expect #{@expected}, but got it anyway"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def test_should_use_the_description_of_matchers_to_generate_test_names
|
60
|
+
context "The number 123" do
|
61
|
+
subject do
|
62
|
+
123
|
63
|
+
end
|
64
|
+
|
65
|
+
should EqualMatcher.new(123)
|
66
|
+
end.
|
67
|
+
should_output(%{
|
68
|
+
The number 123
|
69
|
+
should be equal to 123: .
|
70
|
+
}).
|
71
|
+
and_pass
|
72
|
+
end
|
73
|
+
|
74
|
+
def test_should_use_the_failure_message_of_matchers_to_generate_failure_messages
|
75
|
+
context "The number 456" do
|
76
|
+
subject do
|
77
|
+
456
|
78
|
+
end
|
79
|
+
|
80
|
+
should EqualMatcher.new(123)
|
81
|
+
end.
|
82
|
+
should_fail.
|
83
|
+
with_failure("Expected 123, but got 456")
|
84
|
+
end
|
85
|
+
|
86
|
+
def test_should_allow_negation_of_matchers
|
87
|
+
context "The number 123" do
|
88
|
+
subject do
|
89
|
+
123
|
90
|
+
end
|
91
|
+
|
92
|
+
should_not EqualMatcher.new(456)
|
93
|
+
end.
|
94
|
+
should_run_tests(1).
|
95
|
+
and_pass
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_should_generate_corresponding_test_names_for_negated_matchers
|
99
|
+
context "The number 123" do
|
100
|
+
subject do
|
101
|
+
123
|
102
|
+
end
|
103
|
+
|
104
|
+
should_not EqualMatcher.new(456)
|
105
|
+
end.
|
106
|
+
should_output(%{
|
107
|
+
The number 123
|
108
|
+
should not be equal to 456: .
|
109
|
+
}).
|
110
|
+
and_pass
|
111
|
+
end
|
112
|
+
|
113
|
+
def test_should_use_the_negated_failure_message_of_negated_matchers_to_generate_failure_descriptions
|
114
|
+
context "The number 123" do
|
115
|
+
subject do
|
116
|
+
123
|
117
|
+
end
|
118
|
+
|
119
|
+
should_not EqualMatcher.new(123)
|
120
|
+
end.
|
121
|
+
should_fail.
|
122
|
+
with_failure("Didn't expect 123, but got it anyway")
|
123
|
+
end
|
124
|
+
|
125
|
+
# You can also define methods to extend kintama for more readable
|
126
|
+
# tests; instead of `should EqualMatcher.new(value)` you could write
|
127
|
+
# `should be_equal_to(value)`
|
128
|
+
module MethodsWhichReturnMatcherInstances
|
129
|
+
def be_equal_to(expected)
|
130
|
+
EqualMatcher.new(expected)
|
131
|
+
end
|
132
|
+
end
|
133
|
+
|
134
|
+
def test_should_allow_definition_of_matchers_in_contexts
|
135
|
+
Kintama.extend(MethodsWhichReturnMatcherInstances)
|
136
|
+
|
137
|
+
context "The number 123" do
|
138
|
+
subject do
|
139
|
+
123
|
140
|
+
end
|
141
|
+
|
142
|
+
should be_equal_to(123)
|
143
|
+
should_not be_equal_to(456)
|
144
|
+
end.
|
145
|
+
should_run_tests(2).
|
146
|
+
and_pass
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,118 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ActionTest < KintamaIntegrationTest
|
4
|
+
|
5
|
+
def test_should_run_action_between_setup_and_test
|
6
|
+
context "Given a context with an `action`" do
|
7
|
+
setup do
|
8
|
+
@thing = 123
|
9
|
+
end
|
10
|
+
|
11
|
+
action do
|
12
|
+
@thing += 1
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should have called the action between the `setup` and the test" do
|
16
|
+
assert @thing == 124
|
17
|
+
end
|
18
|
+
end.
|
19
|
+
should_output(%{
|
20
|
+
Given a context with an `action`
|
21
|
+
it should have called the action between the `setup` and the test: .
|
22
|
+
}).
|
23
|
+
and_pass
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_should_run_action_after_all_setups
|
27
|
+
context "Given an action" do
|
28
|
+
setup do
|
29
|
+
@thing = 123
|
30
|
+
end
|
31
|
+
|
32
|
+
setup do
|
33
|
+
@thing *= 2
|
34
|
+
end
|
35
|
+
|
36
|
+
action do
|
37
|
+
@thing += 1
|
38
|
+
end
|
39
|
+
|
40
|
+
it "should have called the action after all setup blocks" do
|
41
|
+
assert @thing == 247
|
42
|
+
end
|
43
|
+
end.
|
44
|
+
should_output(%{
|
45
|
+
Given an action
|
46
|
+
it should have called the action after all setup blocks
|
47
|
+
}).
|
48
|
+
and_pass
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_should_run_action_after_setups_in_nested_contexts
|
52
|
+
context "Given an action" do
|
53
|
+
setup do
|
54
|
+
@thing = 123
|
55
|
+
end
|
56
|
+
|
57
|
+
action do
|
58
|
+
@thing += 1
|
59
|
+
end
|
60
|
+
|
61
|
+
it "should have called the action after the first setup for outer tests" do
|
62
|
+
assert @thing == 124
|
63
|
+
end
|
64
|
+
|
65
|
+
context "and a setup in a nested context" do
|
66
|
+
setup do
|
67
|
+
@thing *= 2
|
68
|
+
end
|
69
|
+
it "should have called the action after both outer and inner setups" do
|
70
|
+
assert @thing == 247
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end.
|
74
|
+
should_output(%{
|
75
|
+
Given an action
|
76
|
+
it should have called the action after the first setup for outer tests: .
|
77
|
+
and a setup in a nested context
|
78
|
+
it should have called the action after both outer and inner setups: .
|
79
|
+
}).
|
80
|
+
and_pass
|
81
|
+
end
|
82
|
+
|
83
|
+
def test_should_allow_subcontexts_to_change_parameters_used_in_action
|
84
|
+
context "A doubling action" do
|
85
|
+
action do
|
86
|
+
@result = @parameter * 2
|
87
|
+
end
|
88
|
+
|
89
|
+
context "when the parameter is 2" do
|
90
|
+
setup do
|
91
|
+
@parameter = 2
|
92
|
+
end
|
93
|
+
|
94
|
+
should "result in 4" do
|
95
|
+
assert_equal 4, @result
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
context "when the parameter is 3" do
|
100
|
+
setup do
|
101
|
+
@parameter = 3
|
102
|
+
end
|
103
|
+
|
104
|
+
should "result in 6" do
|
105
|
+
assert_equal 6, @result
|
106
|
+
end
|
107
|
+
end
|
108
|
+
end.
|
109
|
+
should_output(%{
|
110
|
+
A doubling action
|
111
|
+
when the parameter is 2
|
112
|
+
should result in 4: .
|
113
|
+
when the parameter is 3
|
114
|
+
should result in 6: .
|
115
|
+
}).
|
116
|
+
and_pass
|
117
|
+
end
|
118
|
+
end
|