rspec-core 2.0.0.a1
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/.document +5 -0
- data/.gitignore +7 -0
- data/.treasure_map.rb +23 -0
- data/License.txt +22 -0
- data/README.markdown +9 -0
- data/Rakefile +76 -0
- data/TODO.markdown +16 -0
- data/VERSION +1 -0
- data/VERSION.yml +5 -0
- data/bin/rspec +12 -0
- data/cucumber.yml +2 -0
- data/example_specs/failing/README.txt +7 -0
- data/example_specs/failing/diffing_spec.rb +36 -0
- data/example_specs/failing/failing_implicit_docstrings_example.rb +19 -0
- data/example_specs/failing/failure_in_after.rb +10 -0
- data/example_specs/failing/failure_in_before.rb +10 -0
- data/example_specs/failing/mocking_example.rb +40 -0
- data/example_specs/failing/mocking_with_flexmock.rb +26 -0
- data/example_specs/failing/mocking_with_mocha.rb +25 -0
- data/example_specs/failing/mocking_with_rr.rb +27 -0
- data/example_specs/failing/partial_mock_example.rb +20 -0
- data/example_specs/failing/pending_example.rb +9 -0
- data/example_specs/failing/predicate_example.rb +34 -0
- data/example_specs/failing/raising_example.rb +47 -0
- data/example_specs/failing/spec_helper.rb +3 -0
- data/example_specs/failing/syntax_error_example.rb +7 -0
- data/example_specs/failing/team_spec.rb +44 -0
- data/example_specs/failing/timeout_behaviour.rb +7 -0
- data/example_specs/passing/custom_formatter.rb +12 -0
- data/example_specs/passing/custom_matchers.rb +54 -0
- data/example_specs/passing/dynamic_spec.rb +9 -0
- data/example_specs/passing/file_accessor.rb +19 -0
- data/example_specs/passing/file_accessor_spec.rb +38 -0
- data/example_specs/passing/filtered_formatter.rb +18 -0
- data/example_specs/passing/filtered_formatter_example.rb +31 -0
- data/example_specs/passing/greeter_spec.rb +31 -0
- data/example_specs/passing/helper_method_example.rb +14 -0
- data/example_specs/passing/implicit_docstrings_example.rb +18 -0
- data/example_specs/passing/io_processor.rb +8 -0
- data/example_specs/passing/io_processor_spec.rb +21 -0
- data/example_specs/passing/mocking_example.rb +27 -0
- data/example_specs/passing/multi_threaded_example_group_runner.rb +26 -0
- data/example_specs/passing/nested_classes_example.rb +36 -0
- data/example_specs/passing/options_example.rb +31 -0
- data/example_specs/passing/options_formatter.rb +20 -0
- data/example_specs/passing/partial_mock_example.rb +29 -0
- data/example_specs/passing/pending_example.rb +20 -0
- data/example_specs/passing/predicate_example.rb +27 -0
- data/example_specs/passing/shared_example_group_example.rb +81 -0
- data/example_specs/passing/shared_stack_examples.rb +36 -0
- data/example_specs/passing/simple_matcher_example.rb +31 -0
- data/example_specs/passing/spec_helper.rb +14 -0
- data/example_specs/passing/stack.rb +36 -0
- data/example_specs/passing/stack_spec.rb +64 -0
- data/example_specs/passing/stack_spec_with_nested_example_groups.rb +67 -0
- data/example_specs/passing/stubbing_example.rb +69 -0
- data/example_specs/passing/yielding_example.rb +33 -0
- data/example_specs/ruby1.9.compatibility/access_to_constants_spec.rb +85 -0
- data/features-pending/command_line/line_number_option.feature +56 -0
- data/features-pending/command_line/line_number_option_with_example_with_no_name.feature +22 -0
- data/features-pending/example_groups/example_group_with_should_methods.feature +29 -0
- data/features-pending/example_groups/implicit_docstrings.feature +59 -0
- data/features-pending/example_groups/nested_groups.feature +32 -0
- data/features-pending/expectations/expect_change.feature +65 -0
- data/features-pending/expectations/expect_error.feature +44 -0
- data/features-pending/extensions/custom_example_group.feature +19 -0
- data/features-pending/formatters/custom_formatter.feature +30 -0
- data/features-pending/heckle/heckle.feature +56 -0
- data/features-pending/interop/examples_and_tests_together.feature +80 -0
- data/features-pending/interop/rspec_output.feature +25 -0
- data/features-pending/interop/test_but_not_test_unit.feature +26 -0
- data/features-pending/interop/test_case_with_should_methods.feature +46 -0
- data/features-pending/matchers/define_diffable_matcher.feature +26 -0
- data/features-pending/matchers/define_matcher.feature +179 -0
- data/features-pending/matchers/define_matcher_with_fluent_interface.feature +27 -0
- data/features-pending/mocks/mix_stubs_and_mocks.feature +22 -0
- data/features-pending/mocks/stub_implementation.feature +26 -0
- data/features-pending/pending/pending_examples.feature +81 -0
- data/features-pending/runner/specify_line_number.feature +32 -0
- data/features/before_and_after_blocks/before_and_after_blocks.feature +169 -0
- data/features/expectations/customized_message.feature +54 -0
- data/features/matchers/define_matcher_outside_rspec.feature +39 -0
- data/features/mock_framework_integration/use_flexmock.feature +23 -0
- data/features/mock_framework_integration/use_mocha.feature +23 -0
- data/features/mock_framework_integration/use_rr.feature +23 -0
- data/features/mock_framework_integration/use_rspec.feature +23 -0
- data/features/step_definitions/running_rspec_steps.rb +35 -0
- data/features/subject/explicit_subject.feature +31 -0
- data/features/subject/implicit_subject.feature +31 -0
- data/features/support/env.rb +82 -0
- data/features/support/matchers/smart_match.rb +14 -0
- data/lib/rspec/autorun.rb +2 -0
- data/lib/rspec/core.rb +38 -0
- data/lib/rspec/core/backward_compatibility.rb +9 -0
- data/lib/rspec/core/command_line_options.rb +60 -0
- data/lib/rspec/core/configuration.rb +222 -0
- data/lib/rspec/core/deprecation.rb +47 -0
- data/lib/rspec/core/example.rb +113 -0
- data/lib/rspec/core/example_group.rb +239 -0
- data/lib/rspec/core/example_group_subject.rb +77 -0
- data/lib/rspec/core/formatters.rb +16 -0
- data/lib/rspec/core/formatters/base_formatter.rb +123 -0
- data/lib/rspec/core/formatters/base_text_formatter.rb +139 -0
- data/lib/rspec/core/formatters/documentation_formatter.rb +84 -0
- data/lib/rspec/core/formatters/progress_formatter.rb +36 -0
- data/lib/rspec/core/kernel_extensions.rb +15 -0
- data/lib/rspec/core/mocking/with_absolutely_nothing.rb +13 -0
- data/lib/rspec/core/mocking/with_flexmock.rb +25 -0
- data/lib/rspec/core/mocking/with_mocha.rb +22 -0
- data/lib/rspec/core/mocking/with_rr.rb +26 -0
- data/lib/rspec/core/mocking/with_rspec.rb +21 -0
- data/lib/rspec/core/rake_task.rb +88 -0
- data/lib/rspec/core/runner.rb +66 -0
- data/lib/rspec/core/shared_behaviour.rb +41 -0
- data/lib/rspec/core/shared_behaviour_kernel_extensions.rb +31 -0
- data/lib/rspec/core/version.rb +16 -0
- data/lib/rspec/core/world.rb +105 -0
- data/rspec-core.gemspec +204 -0
- data/script/console +8 -0
- data/spec/resources/example_classes.rb +67 -0
- data/spec/rspec/core/command_line_options_spec.rb +63 -0
- data/spec/rspec/core/configuration_spec.rb +171 -0
- data/spec/rspec/core/example_group_spec.rb +351 -0
- data/spec/rspec/core/example_group_subject_spec.rb +67 -0
- data/spec/rspec/core/example_spec.rb +67 -0
- data/spec/rspec/core/formatters/base_formatter_spec.rb +105 -0
- data/spec/rspec/core/formatters/documentation_formatter_spec.rb +5 -0
- data/spec/rspec/core/formatters/progress_formatter_spec.rb +29 -0
- data/spec/rspec/core/kernel_extensions_spec.rb +13 -0
- data/spec/rspec/core/mocha_spec.rb +29 -0
- data/spec/rspec/core/resources/a_bar.rb +0 -0
- data/spec/rspec/core/resources/a_foo.rb +0 -0
- data/spec/rspec/core/resources/a_spec.rb +1 -0
- data/spec/rspec/core/resources/custom_example_group_runner.rb +14 -0
- data/spec/rspec/core/resources/example_classes.rb +67 -0
- data/spec/rspec/core/resources/utf8_encoded.rb +8 -0
- data/spec/rspec/core/runner_spec.rb +34 -0
- data/spec/rspec/core/shared_behaviour_spec.rb +185 -0
- data/spec/rspec/core/world_spec.rb +167 -0
- data/spec/rspec/core_spec.rb +35 -0
- data/spec/ruby_forker.rb +13 -0
- data/spec/spec_helper.rb +72 -0
- metadata +219 -0
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Feature: expect error
|
|
2
|
+
|
|
3
|
+
Expect a proc to change the state of some object.
|
|
4
|
+
|
|
5
|
+
Scenario: expect error
|
|
6
|
+
Given a file named "expect_error.rb" with:
|
|
7
|
+
"""
|
|
8
|
+
describe Object, "#non_existent_message" do
|
|
9
|
+
it "should raise" do
|
|
10
|
+
expect{Object.non_existent_message}.to raise_error(NameError)
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
#deliberate failure
|
|
15
|
+
describe Object, "#public_instance_methods" do
|
|
16
|
+
it "should raise" do
|
|
17
|
+
expect{Object.public_instance_methods}.to raise_error(NameError)
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
"""
|
|
21
|
+
When I run "spec expect_error.rb"
|
|
22
|
+
Then the stdout should match "2 examples, 1 failure"
|
|
23
|
+
Then the stdout should match "expected NameError but nothing was raised"
|
|
24
|
+
|
|
25
|
+
Scenario: expect no error
|
|
26
|
+
Given a file named "expect_no_error.rb" with:
|
|
27
|
+
"""
|
|
28
|
+
describe Object, "#public_instance_methods" do
|
|
29
|
+
it "should not raise" do
|
|
30
|
+
expect{Object.public_instance_methods}.to_not raise_error(NameError)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
#deliberate failure
|
|
35
|
+
describe Object, "#non_existent_message" do
|
|
36
|
+
it "should not raise" do
|
|
37
|
+
expect{Object.non_existent_message}.to_not raise_error(NameError)
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
"""
|
|
41
|
+
When I run "spec expect_no_error.rb"
|
|
42
|
+
Then the stdout should match "2 examples, 1 failure"
|
|
43
|
+
Then the stdout should match "undefined method `non_existent_message'"
|
|
44
|
+
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
Feature: custom example group
|
|
2
|
+
|
|
3
|
+
Scenario: simple custom example group
|
|
4
|
+
Given a file named "custom_example_group_spec.rb" with:
|
|
5
|
+
"""
|
|
6
|
+
class CustomGroup < Spec::ExampleGroup
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
Spec::Example::ExampleGroupFactory.default(CustomGroup)
|
|
10
|
+
|
|
11
|
+
describe "setting a default example group base class" do
|
|
12
|
+
it "should use that class by default" do
|
|
13
|
+
CustomGroup.should === self
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
"""
|
|
17
|
+
When I run "spec custom_example_group_spec.rb"
|
|
18
|
+
Then the stdout should match "1 example, 0 failures"
|
|
19
|
+
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
Feature: custom formatters
|
|
2
|
+
|
|
3
|
+
In order to format output/reporting to my particular needs
|
|
4
|
+
As an RSpec user
|
|
5
|
+
I want to create my own custom output formatters
|
|
6
|
+
|
|
7
|
+
Scenario: specdoc format
|
|
8
|
+
Given a file named "custom_formatter.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
require 'spec/runner/formatter/base_formatter'
|
|
11
|
+
class CustomFormatter < Spec::Runner::Formatter::BaseFormatter
|
|
12
|
+
def initialize(options, output)
|
|
13
|
+
@output = output
|
|
14
|
+
end
|
|
15
|
+
def example_started(proxy)
|
|
16
|
+
@output << "example: " << proxy.description
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
"""
|
|
20
|
+
And a file named "simple_example_spec.rb" with:
|
|
21
|
+
"""
|
|
22
|
+
describe "my group" do
|
|
23
|
+
specify "my example" do
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
"""
|
|
27
|
+
|
|
28
|
+
When I run "spec simple_example_spec.rb --require custom_formatter.rb --format CustomFormatter"
|
|
29
|
+
Then the exit code should be 0
|
|
30
|
+
And the stdout should match "example: my example"
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
Feature: heckle a class
|
|
2
|
+
|
|
3
|
+
As an RSpec user who wants to verify that
|
|
4
|
+
my specs cover what I think it covers
|
|
5
|
+
I want to heckle a class
|
|
6
|
+
|
|
7
|
+
Scenario: Heckle finds problems
|
|
8
|
+
Given a file named "heckle_fail_spec.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
class Thing
|
|
11
|
+
def a_or_b
|
|
12
|
+
if true
|
|
13
|
+
"a"
|
|
14
|
+
else
|
|
15
|
+
"b"
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe Thing do
|
|
21
|
+
it "returns a for true" do
|
|
22
|
+
Thing.new.a_or_b.should == "a"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
"""
|
|
26
|
+
When I run "spec heckle_fail_spec.rb --heckle Thing"
|
|
27
|
+
Then the stdout should match "The following mutations didn't cause test failures:"
|
|
28
|
+
But the stdout should not match "FAILED"
|
|
29
|
+
|
|
30
|
+
Scenario: Heckle does not find a problem
|
|
31
|
+
Given a file named "heckle_success_spec.rb" with:
|
|
32
|
+
"""
|
|
33
|
+
class Thing
|
|
34
|
+
def a_or_b(key)
|
|
35
|
+
if key
|
|
36
|
+
"a"
|
|
37
|
+
else
|
|
38
|
+
"b"
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
describe Thing do
|
|
44
|
+
it "returns a for true" do
|
|
45
|
+
Thing.new.a_or_b(true).should == "a"
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
it "returns b for false" do
|
|
49
|
+
Thing.new.a_or_b(false).should == "b"
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
"""
|
|
53
|
+
When I run "spec heckle_success_spec.rb --heckle Thing"
|
|
54
|
+
Then the stdout should match "No mutants survived"
|
|
55
|
+
But the stdout should not match "FAILED"
|
|
56
|
+
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
Feature: Spec and test together
|
|
2
|
+
|
|
3
|
+
As an RSpec adopter with existing Test::Unit tests
|
|
4
|
+
I want to run a few specs alongside my existing Test::Unit tests
|
|
5
|
+
So that I can experience a smooth, gradual migration path
|
|
6
|
+
|
|
7
|
+
Scenario Outline: Run specs and tests together
|
|
8
|
+
Given a file named "spec_and_test_together.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
require 'rspec/autorun'
|
|
11
|
+
require 'spec/test/unit'
|
|
12
|
+
|
|
13
|
+
describe "An Example" do
|
|
14
|
+
it "should pass with assert" do
|
|
15
|
+
assert true
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it "should fail with assert" do
|
|
19
|
+
assert false
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
it "should pass with should" do
|
|
23
|
+
1.should == 1
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
it "should fail with should" do
|
|
27
|
+
1.should == 2
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
class ATest < Test::Unit::TestCase
|
|
32
|
+
def test_should_pass_with_assert
|
|
33
|
+
assert true
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def test_should_fail_with_assert
|
|
37
|
+
assert false
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def test_should_pass_with_should
|
|
41
|
+
1.should == 1
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def test_should_fail_with_should
|
|
45
|
+
1.should == 2
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def setup
|
|
49
|
+
@from_setup ||= 3
|
|
50
|
+
@from_setup += 1
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def test_should_fail_with_setup_method_variable
|
|
54
|
+
@from_setup.should == 40
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
before do
|
|
58
|
+
@from_before = @from_setup + 1
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
def test_should_fail_with_before_block_variable
|
|
62
|
+
@from_before.should == 50
|
|
63
|
+
end
|
|
64
|
+
end
|
|
65
|
+
"""
|
|
66
|
+
|
|
67
|
+
When I run "<Command> spec_and_test_together.rb -fs"
|
|
68
|
+
|
|
69
|
+
Then the exit code should be 256
|
|
70
|
+
And the stdout should match "ATest"
|
|
71
|
+
And the stdout should match "Test::Unit::AssertionFailedError in 'An Example should fail with assert'"
|
|
72
|
+
And the stdout should match "'An Example should fail with should' FAILED"
|
|
73
|
+
And the stdout should match "10 examples, 6 failures"
|
|
74
|
+
And the stdout should match /expected: 40,\s*got: 4/m
|
|
75
|
+
And the stdout should match /expected: 50,\s*got: 5/m
|
|
76
|
+
|
|
77
|
+
Scenarios: run with ruby and spec
|
|
78
|
+
| Command |
|
|
79
|
+
| ruby |
|
|
80
|
+
| spec |
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
Feature: spec output
|
|
2
|
+
|
|
3
|
+
When running in interop mode with test/unit, RSpec will output
|
|
4
|
+
the RSpec summary, but not the test/unit summary.
|
|
5
|
+
|
|
6
|
+
Scenario Outline: Interop mode with test/unit
|
|
7
|
+
Given a file named "simple_spec.rb" with:
|
|
8
|
+
"""
|
|
9
|
+
require 'rspec/autorun'
|
|
10
|
+
|
|
11
|
+
describe "Running an Example" do
|
|
12
|
+
it "should not output twice" do
|
|
13
|
+
true.should be_true
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
"""
|
|
17
|
+
When I run "<Command> simple_spec.rb"
|
|
18
|
+
Then the exit code should be 0
|
|
19
|
+
And the stdout should not match /\d+ tests, \d+ assertions, \d+ failures, \d+ errors/m
|
|
20
|
+
And the stdout should match "1 example, 0 failures"
|
|
21
|
+
|
|
22
|
+
Scenarios: Run with ruby and rspec/commands
|
|
23
|
+
| Command |
|
|
24
|
+
| ruby |
|
|
25
|
+
| cmdline.rb |
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Story: Test is defined, but not Test::Unit
|
|
2
|
+
|
|
3
|
+
As an RSpec user who has my own library named Test (but not Test::Unit)
|
|
4
|
+
I want to run examples without getting Test::Unit NameErrors
|
|
5
|
+
|
|
6
|
+
Scenario Outline: Spec including Test const but not Test::Unit
|
|
7
|
+
Given a file named "spec_including_test_but_not_unit.rb" with:
|
|
8
|
+
"""
|
|
9
|
+
require 'rspec/autorun'
|
|
10
|
+
|
|
11
|
+
module Test
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
describe "description" do
|
|
15
|
+
it "should description" do
|
|
16
|
+
1.should == 1
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
"""
|
|
20
|
+
When I run "<Command> spec_including_test_but_not_unit.rb"
|
|
21
|
+
Then the stderr should not match "Test::Unit"
|
|
22
|
+
|
|
23
|
+
Scenarios: Run with ruby and spec
|
|
24
|
+
| Command |
|
|
25
|
+
| ruby |
|
|
26
|
+
| spec |
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
Story: Test::Unit::TestCase extended by rspec with should methods
|
|
2
|
+
|
|
3
|
+
As an RSpec adopter with existing Test::Unit tests
|
|
4
|
+
I want to use should_* methods in a Test::Unit::TestCase
|
|
5
|
+
So that I use RSpec with classes and methods that look more like RSpec examples
|
|
6
|
+
|
|
7
|
+
Scenario Outline: TestCase with should methods
|
|
8
|
+
Given a file named "test_case_with_should_methods.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
require 'rspec/autorun'
|
|
11
|
+
require 'spec/test/unit'
|
|
12
|
+
|
|
13
|
+
class MyTest < Test::Unit::TestCase
|
|
14
|
+
def should_pass_with_should
|
|
15
|
+
1.should == 1
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def should_fail_with_should
|
|
19
|
+
1.should == 2
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def should_pass_with_assert
|
|
23
|
+
assert true
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def should_fail_with_assert
|
|
27
|
+
assert false
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def test
|
|
31
|
+
raise "This is not a real test"
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_ify
|
|
35
|
+
raise "This is a real test"
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
"""
|
|
39
|
+
When I run "<Command> test_case_with_should_methods.rb"
|
|
40
|
+
Then the exit code should be 256
|
|
41
|
+
And the stdout should match "5 examples, 3 failures"
|
|
42
|
+
|
|
43
|
+
Scenarios: Run with ruby and spec
|
|
44
|
+
| Command |
|
|
45
|
+
| ruby |
|
|
46
|
+
| spec |
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
Feature: define diffable matcher
|
|
2
|
+
|
|
3
|
+
When a matcher is defined as diffable, and the --diff
|
|
4
|
+
flag is set, the output will include a diff of the submitted
|
|
5
|
+
objects.
|
|
6
|
+
|
|
7
|
+
Scenario: define a diffable matcher
|
|
8
|
+
Given a file named "diffable_matcher_spec.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
Rspec::Matchers.define :be_just_like do |expected|
|
|
11
|
+
match do |actual|
|
|
12
|
+
actual == expected
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
diffable
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "this" do
|
|
19
|
+
it {should be_just_like("that")}
|
|
20
|
+
end
|
|
21
|
+
"""
|
|
22
|
+
When I run "spec diffable_matcher_spec.rb --diff"
|
|
23
|
+
Then the exit code should be 256
|
|
24
|
+
|
|
25
|
+
And the stdout should match "should be just like \"that\""
|
|
26
|
+
And the stdout should match "Diff:\n@@ -1,2 +1,2 @@\n-that\n+this"
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
Feature: define matcher
|
|
2
|
+
|
|
3
|
+
In order to express my domain clearly in my code examples
|
|
4
|
+
As an RSpec user
|
|
5
|
+
I want a shortcut to define custom matchers
|
|
6
|
+
|
|
7
|
+
Scenario: define a matcher with default messages
|
|
8
|
+
Given a file named "matcher_with_default_message_spec.rb" with:
|
|
9
|
+
"""
|
|
10
|
+
Rspec::Matchers.define :be_a_multiple_of do |expected|
|
|
11
|
+
match do |actual|
|
|
12
|
+
actual % expected == 0
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
describe 9 do
|
|
17
|
+
it {should be_a_multiple_of(3)}
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
describe 9 do
|
|
21
|
+
it {should_not be_a_multiple_of(4)}
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# fail intentionally to generate expected output
|
|
25
|
+
describe 9 do
|
|
26
|
+
it {should be_a_multiple_of(4)}
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# fail intentionally to generate expected output
|
|
30
|
+
describe 9 do
|
|
31
|
+
it {should_not be_a_multiple_of(3)}
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
"""
|
|
35
|
+
When I run "spec matcher_with_default_message_spec.rb --format specdoc"
|
|
36
|
+
Then the exit code should be 256
|
|
37
|
+
|
|
38
|
+
And the stdout should match "should be a multiple of 3"
|
|
39
|
+
And the stdout should match "should not be a multiple of 4"
|
|
40
|
+
And the stdout should match "should be a multiple of 4 (FAILED - 1)"
|
|
41
|
+
And the stdout should match "should not be a multiple of 3 (FAILED - 2)"
|
|
42
|
+
|
|
43
|
+
And the stdout should match "4 examples, 2 failures"
|
|
44
|
+
And the stdout should match "expected 9 to be a multiple of 4"
|
|
45
|
+
And the stdout should match "expected 9 not to be a multiple of 3"
|
|
46
|
+
|
|
47
|
+
Scenario: overriding the failure_message_for_should
|
|
48
|
+
Given a file named "matcher_with_failure_message_spec.rb" with:
|
|
49
|
+
"""
|
|
50
|
+
Rspec::Matchers.define :be_a_multiple_of do |expected|
|
|
51
|
+
match do |actual|
|
|
52
|
+
actual % expected == 0
|
|
53
|
+
end
|
|
54
|
+
failure_message_for_should do |actual|
|
|
55
|
+
"expected that #{actual} would be a multiple of #{expected}"
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# fail intentionally to generate expected output
|
|
60
|
+
describe 9 do
|
|
61
|
+
it {should be_a_multiple_of(4)}
|
|
62
|
+
end
|
|
63
|
+
"""
|
|
64
|
+
When I run "spec matcher_with_failure_message_spec.rb"
|
|
65
|
+
Then the exit code should be 256
|
|
66
|
+
And the stdout should match "1 example, 1 failure"
|
|
67
|
+
And the stdout should match "expected that 9 would be a multiple of 4"
|
|
68
|
+
|
|
69
|
+
Scenario: overriding the failure_message_for_should_not
|
|
70
|
+
Given a file named "matcher_with_failure_for_message_spec.rb" with:
|
|
71
|
+
"""
|
|
72
|
+
Rspec::Matchers.define :be_a_multiple_of do |expected|
|
|
73
|
+
match do |actual|
|
|
74
|
+
actual % expected == 0
|
|
75
|
+
end
|
|
76
|
+
failure_message_for_should_not do |actual|
|
|
77
|
+
"expected that #{actual} would not be a multiple of #{expected}"
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
# fail intentionally to generate expected output
|
|
82
|
+
describe 9 do
|
|
83
|
+
it {should_not be_a_multiple_of(3)}
|
|
84
|
+
end
|
|
85
|
+
"""
|
|
86
|
+
When I run "spec matcher_with_failure_for_message_spec.rb"
|
|
87
|
+
Then the exit code should be 256
|
|
88
|
+
And the stdout should match "1 example, 1 failure"
|
|
89
|
+
And the stdout should match "expected that 9 would not be a multiple of 3"
|
|
90
|
+
|
|
91
|
+
Scenario: overriding the description
|
|
92
|
+
Given a file named "matcher_overriding_description_spec.rb" with:
|
|
93
|
+
"""
|
|
94
|
+
Rspec::Matchers.define :be_a_multiple_of do |expected|
|
|
95
|
+
match do |actual|
|
|
96
|
+
actual % expected == 0
|
|
97
|
+
end
|
|
98
|
+
description do
|
|
99
|
+
"be multiple of #{expected}"
|
|
100
|
+
end
|
|
101
|
+
end
|
|
102
|
+
|
|
103
|
+
describe 9 do
|
|
104
|
+
it {should be_a_multiple_of(3)}
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
describe 9 do
|
|
108
|
+
it {should_not be_a_multiple_of(4)}
|
|
109
|
+
end
|
|
110
|
+
"""
|
|
111
|
+
When I run "spec matcher_overriding_description_spec.rb --format specdoc"
|
|
112
|
+
Then the exit code should be 0
|
|
113
|
+
And the stdout should match "2 examples, 0 failures"
|
|
114
|
+
And the stdout should match "should be multiple of 3"
|
|
115
|
+
And the stdout should match "should not be multiple of 4"
|
|
116
|
+
|
|
117
|
+
Scenario: with no args
|
|
118
|
+
Given a file named "matcher_with_no_args_spec.rb" with:
|
|
119
|
+
"""
|
|
120
|
+
Rspec::Matchers.define :have_7_fingers do
|
|
121
|
+
match do |thing|
|
|
122
|
+
thing.fingers.length == 7
|
|
123
|
+
end
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
class Thing
|
|
127
|
+
def fingers; (1..7).collect {"finger"}; end
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
describe Thing do
|
|
131
|
+
it {should have_7_fingers}
|
|
132
|
+
end
|
|
133
|
+
"""
|
|
134
|
+
When I run "spec matcher_with_no_args_spec.rb --format specdoc"
|
|
135
|
+
Then the exit code should be 0
|
|
136
|
+
And the stdout should match "1 example, 0 failures"
|
|
137
|
+
And the stdout should match "should have 7 fingers"
|
|
138
|
+
|
|
139
|
+
Scenario: with multiple args
|
|
140
|
+
Given a file named "matcher_with_multiple_args_spec.rb" with:
|
|
141
|
+
"""
|
|
142
|
+
Rspec::Matchers.define :be_the_sum_of do |a,b,c,d|
|
|
143
|
+
match do |sum|
|
|
144
|
+
a + b + c + d == sum
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
describe 10 do
|
|
149
|
+
it {should be_the_sum_of(1,2,3,4)}
|
|
150
|
+
end
|
|
151
|
+
"""
|
|
152
|
+
When I run "spec matcher_with_multiple_args_spec.rb --format specdoc"
|
|
153
|
+
Then the exit code should be 0
|
|
154
|
+
And the stdout should match "1 example, 0 failures"
|
|
155
|
+
And the stdout should match "should be the sum of 1, 2, 3, and 4"
|
|
156
|
+
|
|
157
|
+
Scenario: with helper methods
|
|
158
|
+
Given a file named "matcher_with_internal_helper_spec.rb" with:
|
|
159
|
+
"""
|
|
160
|
+
Rspec::Matchers.define :have_same_elements_as do |sample|
|
|
161
|
+
match do |actual|
|
|
162
|
+
similar?(sample, actual)
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def similar?(a, b)
|
|
166
|
+
a.sort == b.sort
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
describe "these two arrays" do
|
|
171
|
+
specify "should be similar" do
|
|
172
|
+
[1,2,3].should have_same_elements_as([2,3,1])
|
|
173
|
+
end
|
|
174
|
+
end
|
|
175
|
+
"""
|
|
176
|
+
When I run "spec matcher_with_internal_helper_spec.rb"
|
|
177
|
+
Then the exit code should be 0
|
|
178
|
+
And the stdout should match "1 example, 0 failures"
|
|
179
|
+
|