rr 1.1.1 → 3.0.0
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.
- checksums.yaml +5 -5
- data/Appraisals +6 -0
- data/CHANGES.md +102 -1
- data/CREDITS.md +5 -0
- data/Gemfile +3 -0
- data/README.md +91 -110
- data/Rakefile +43 -0
- data/doc/02_syntax_comparison.md +1 -0
- data/gemfiles/ruby_19_rspec_2.gemfile +14 -0
- data/gemfiles/ruby_19_rspec_2.gemfile.lock +49 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile +15 -0
- data/gemfiles/ruby_19_rspec_2_rails_4.gemfile.lock +119 -0
- data/lib/rr/class_instance_method_defined.rb +1 -1
- data/lib/rr/core_ext/array.rb +2 -0
- data/lib/rr/core_ext/hash.rb +2 -0
- data/lib/rr/deprecations.rb +97 -0
- data/lib/rr/double.rb +28 -10
- data/lib/rr/double_definitions/double_definition.rb +39 -16
- data/lib/rr/double_definitions/double_definition_create.rb +5 -5
- data/lib/rr/double_definitions/double_definition_create_blank_slate.rb +10 -4
- data/lib/rr/double_definitions/double_injections/any_instance_of.rb +1 -1
- data/lib/rr/double_definitions/double_injections/instance.rb +2 -2
- data/lib/rr/double_definitions/strategies/strategy.rb +27 -8
- data/lib/rr/double_definitions/strategies/verification/mock.rb +8 -2
- data/lib/rr/double_matches.rb +4 -3
- data/lib/rr/dsl.rb +152 -0
- data/lib/rr/expectations/any_argument_expectation.rb +4 -4
- data/lib/rr/expectations/argument_equality_expectation.rb +43 -5
- data/lib/rr/injections/double_injection.rb +67 -19
- data/lib/rr/injections/method_missing_injection.rb +37 -6
- data/lib/rr/integrations.rb +13 -12
- data/lib/rr/integrations/decorator.rb +4 -1
- data/lib/rr/integrations/minitest_4.rb +1 -1
- data/lib/rr/integrations/minitest_4_active_support.rb +1 -1
- data/lib/rr/integrations/rspec/invocation_matcher.rb +0 -8
- data/lib/rr/integrations/rspec_2.rb +28 -3
- data/lib/rr/keyword_arguments.rb +15 -0
- data/lib/rr/method_dispatches/base_method_dispatch.rb +22 -5
- data/lib/rr/method_dispatches/method_dispatch.rb +21 -10
- data/lib/rr/method_dispatches/method_missing_dispatch.rb +14 -5
- data/lib/rr/recorded_call.rb +35 -0
- data/lib/rr/recorded_calls.rb +23 -9
- data/lib/rr/space.rb +15 -5
- data/lib/rr/spy_verification.rb +13 -5
- data/lib/rr/version.rb +1 -2
- data/lib/rr/wildcard_matchers.rb +10 -10
- data/lib/rr/without_autohook.rb +7 -14
- data/rr.gemspec +14 -5
- data/spec/custom_formatter_for_rspec.rb +18 -0
- data/spec/custom_formatter_for_rspec_2.rb +40 -0
- data/spec/defines_spec_suite_tasks.rb +57 -0
- data/spec/fixtures/rubygems_patch_for_187.rb +598 -0
- data/spec/global_helper.rb +38 -0
- data/spec/spec.opts +3 -0
- data/spec/spec_suite_configuration.rb +126 -0
- data/spec/spec_suite_runner.rb +47 -0
- data/spec/suites.yml +10 -0
- data/spec/suites/rspec_2/functional/any_instance_of_spec.rb +147 -0
- data/spec/suites/rspec_2/functional/dont_allow_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/mock_proxy_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/mock_spec.rb +17 -0
- data/spec/suites/rspec_2/functional/mock_strong_spec.rb +14 -0
- data/spec/suites/rspec_2/functional/received_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/spy_spec.rb +102 -0
- data/spec/suites/rspec_2/functional/stub_bang_spec.rb +20 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_instance_of_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/stub_proxy_instance_of_spec.rb +16 -0
- data/spec/suites/rspec_2/functional/stub_proxy_spec.rb +45 -0
- data/spec/suites/rspec_2/functional/stub_spec.rb +71 -0
- data/spec/suites/rspec_2/functional/stub_strong_spec.rb +15 -0
- data/spec/suites/rspec_2/functional/wildcard_matchers_spec.rb +128 -0
- data/spec/suites/rspec_2/helper.rb +28 -0
- data/spec/suites/rspec_2/integration/minitest_4_spec.rb +109 -0
- data/spec/suites/rspec_2/integration/minitest_spec.rb +109 -0
- data/spec/suites/rspec_2/spec_helper.rb +3 -0
- data/spec/suites/rspec_2/support/matchers/wildcard_matcher_matchers.rb +32 -0
- data/spec/suites/rspec_2/support/mixins/double_definition_creator_helpers.rb +173 -0
- data/spec/suites/rspec_2/support/mixins/mock_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/mixins/proxy_definition_creator_helpers.rb +33 -0
- data/spec/suites/rspec_2/support/mixins/stub_creator_helpers.rb +43 -0
- data/spec/suites/rspec_2/support/mixins/stub_definition_creator_helpers.rb +45 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_never_called_qualifier.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_with_times_called_qualifier.rb +50 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/argument_expectations_without_qualifiers.rb +131 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/dont_allow.rb +148 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of.rb +26 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_instance_of_strong.rb +28 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mock_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/mocking.rb +107 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of.rb +32 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_instance_of_strong.rb +39 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_proxy.rb +11 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stub_strong.rb +37 -0
- data/spec/suites/rspec_2/support/shared_contexts/double_definition_creators/stubbing.rb +57 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/array_flatten_bug.rb +35 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/block_form.rb +31 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/comparing_arity.rb +63 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/object_is_proxy.rb +43 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/sequential_invocations.rb +26 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/setting_implementation.rb +51 -0
- data/spec/suites/rspec_2/support/shared_examples/double_definition_creators/yields.rb +81 -0
- data/spec/suites/rspec_2/support/shared_examples/space.rb +13 -0
- data/spec/suites/rspec_2/support/shared_examples/times_called_expectation.rb +9 -0
- data/spec/suites/rspec_2/unit/core_ext/array_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/core_ext/enumerable_spec.rb +53 -0
- data/spec/suites/rspec_2/unit/core_ext/hash_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/core_ext/range_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/core_ext/regexp_spec.rb +41 -0
- data/spec/suites/rspec_2/unit/deprecations_spec.rb +27 -0
- data/spec/suites/rspec_2/unit/double_definitions/child_double_definition_create_spec.rb +114 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_blank_slate_spec.rb +93 -0
- data/spec/suites/rspec_2/unit/double_definitions/double_definition_create_spec.rb +446 -0
- data/spec/suites/rspec_2/unit/dsl/double_creators_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/dsl/space_spec.rb +99 -0
- data/spec/suites/rspec_2/unit/dsl/wildcard_matchers_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/errors/rr_error_spec.rb +67 -0
- data/spec/suites/rspec_2/unit/expectations/any_argument_expectation_spec.rb +48 -0
- data/spec/suites/rspec_2/unit/expectations/anything_argument_equality_expectation_spec.rb +14 -0
- data/spec/suites/rspec_2/unit/expectations/argument_equality_expectation_spec.rb +135 -0
- data/spec/suites/rspec_2/unit/expectations/boolean_argument_equality_expectation_spec.rb +30 -0
- data/spec/suites/rspec_2/unit/expectations/hash_including_argument_equality_expectation_spec.rb +92 -0
- data/spec/suites/rspec_2/unit/expectations/satisfy_argument_equality_expectation_spec.rb +61 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/any_times_matcher_spec.rb +22 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_least_matcher_spec.rb +37 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/at_most_matcher_spec.rb +43 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/integer_matcher_spec.rb +58 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/proc_matcher_spec.rb +35 -0
- data/spec/suites/rspec_2/unit/expectations/times_called_expectation/range_matcher_spec.rb +39 -0
- data/spec/suites/rspec_2/unit/hash_with_object_id_key_spec.rb +88 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_spec.rb +533 -0
- data/spec/suites/rspec_2/unit/injections/double_injection/double_injection_verify_spec.rb +32 -0
- data/spec/suites/rspec_2/unit/integrations/rspec/invocation_matcher_spec.rb +297 -0
- data/spec/suites/rspec_2/unit/integrations/rspec_spec.rb +70 -0
- data/spec/suites/rspec_2/unit/rr_spec.rb +28 -0
- data/spec/suites/rspec_2/unit/space_spec.rb +598 -0
- data/spec/suites/rspec_2/unit/spy_verification_spec.rb +133 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/any_times_matcher_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_least_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/at_most_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/integer_matcher_spec.rb +69 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/proc_matcher_spec.rb +54 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/range_matcher_spec.rb +75 -0
- data/spec/suites/rspec_2/unit/times_called_matchers/times_called_matcher_spec.rb +117 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/anything_spec.rb +33 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/boolean_spec.rb +45 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/duck_type_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/hash_including_spec.rb +64 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/is_a_spec.rb +55 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/numeric_spec.rb +46 -0
- data/spec/suites/rspec_2/unit/wildcard_matchers/satisfy_spec.rb +57 -0
- data/spec/support/adapter.rb +22 -0
- data/spec/support/adapter_tests/base.rb +45 -0
- data/spec/support/adapter_tests/minitest.rb +7 -0
- data/spec/support/adapter_tests/rspec.rb +70 -0
- data/spec/support/adapter_tests/test_unit.rb +47 -0
- data/spec/support/command_runner.rb +105 -0
- data/spec/support/generator.rb +56 -0
- data/spec/support/integration_tests/base.rb +64 -0
- data/spec/support/integration_tests/rails.rb +60 -0
- data/spec/support/integration_tests/rails_minitest.rb +13 -0
- data/spec/support/integration_tests/rails_rspec.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit.rb +13 -0
- data/spec/support/integration_tests/rails_test_unit_like.rb +13 -0
- data/spec/support/integration_tests/ruby.rb +7 -0
- data/spec/support/integration_tests/ruby_minitest.rb +13 -0
- data/spec/support/integration_tests/ruby_rspec.rb +13 -0
- data/spec/support/integration_tests/ruby_test_unit.rb +13 -0
- data/spec/support/matchers/be_a_subset_of_matcher.rb +24 -0
- data/spec/support/project/cucumber.rb +50 -0
- data/spec/support/project/generator.rb +348 -0
- data/spec/support/project/minitest.rb +39 -0
- data/spec/support/project/rails.rb +199 -0
- data/spec/support/project/rails_minitest.rb +17 -0
- data/spec/support/project/rails_rspec.rb +50 -0
- data/spec/support/project/rails_test_unit.rb +17 -0
- data/spec/support/project/rails_test_unit_like.rb +17 -0
- data/spec/support/project/rspec.rb +69 -0
- data/spec/support/project/ruby.rb +34 -0
- data/spec/support/project/ruby_minitest.rb +11 -0
- data/spec/support/project/ruby_rspec.rb +29 -0
- data/spec/support/project/ruby_test_unit.rb +11 -0
- data/spec/support/project/ruby_test_unit_like.rb +21 -0
- data/spec/support/project/test_unit.rb +29 -0
- data/spec/support/project/test_unit_like.rb +7 -0
- data/spec/support/project/tests_runner.rb +22 -0
- data/spec/support/test.sqlite3 +0 -0
- data/spec/support/test_case/generator.rb +53 -0
- data/spec/support/test_case/minitest.rb +13 -0
- data/spec/support/test_case/rspec.rb +19 -0
- data/spec/support/test_case/test_unit.rb +21 -0
- data/spec/support/test_file/generator.rb +120 -0
- data/spec/support/test_file/minitest.rb +19 -0
- data/spec/support/test_file/rails_minitest.rb +7 -0
- data/spec/support/test_file/rails_rspec.rb +12 -0
- data/spec/support/test_file/rails_test_unit.rb +25 -0
- data/spec/support/test_file/rspec.rb +33 -0
- data/spec/support/test_file/test_unit.rb +36 -0
- data/spec/support/test_helper/generator.rb +27 -0
- data/spec/support/test_helper/minitest.rb +7 -0
- data/spec/support/test_helper/rails.rb +31 -0
- data/spec/support/test_helper/rails_minitest.rb +7 -0
- data/spec/support/test_helper/rails_rspec.rb +25 -0
- data/spec/support/test_helper/rails_test_unit.rb +23 -0
- data/spec/support/test_helper/rspec.rb +7 -0
- data/spec/support/test_helper/ruby.rb +31 -0
- data/spec/support/test_helper/test_unit.rb +7 -0
- metadata +240 -19
- data/VERSION +0 -1
- data/lib/rr/adapters.rb +0 -44
- data/lib/rr/adapters/rr_methods.rb +0 -142
- data/lib/rr/integrations/rspec_1.rb +0 -46
- data/lib/rr/integrations/test_unit_1.rb +0 -63
- data/lib/rr/integrations/test_unit_2.rb +0 -15
- data/lib/rr/integrations/test_unit_200.rb +0 -27
- data/lib/rr/integrations/test_unit_200_active_support.rb +0 -25
- data/lib/rr/integrations/test_unit_2_active_support.rb +0 -38
- data/lib/rr/proc_from_block.rb +0 -11
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
require 'rspec/core'
|
|
2
|
+
require 'rspec/expectations'
|
|
3
|
+
require 'rspec/autorun'
|
|
4
|
+
|
|
5
|
+
require 'rr'
|
|
6
|
+
|
|
7
|
+
module ExampleMethods
|
|
8
|
+
def eigen(object)
|
|
9
|
+
class << object; self; end
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
module ExampleGroupMethods
|
|
14
|
+
def macro(name, &implementation)
|
|
15
|
+
(class << self; self; end).class_eval do
|
|
16
|
+
define_method(name, &implementation)
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
RSpec.configure do |c|
|
|
22
|
+
c.include ExampleMethods
|
|
23
|
+
c.extend ExampleGroupMethods
|
|
24
|
+
c.order = :random
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
Dir[ File.expand_path('../shared/*.rb', __FILE__) ].sort.each {|fn| require fn }
|
|
28
|
+
Dir[ File.expand_path('../support/**/*.rb', __FILE__) ].sort.each {|fn| require fn }
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe 'Integration with MiniTest 4' do
|
|
4
|
+
include IntegrationTests::RubyMinitest
|
|
5
|
+
|
|
6
|
+
def configure_project_generator(project_generator)
|
|
7
|
+
super
|
|
8
|
+
project_generator.configure do |project|
|
|
9
|
+
project.minitest_version = 4
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.including_the_adapter_manually_works
|
|
14
|
+
specify "including the adapter manually works" do
|
|
15
|
+
project = generate_project do |project|
|
|
16
|
+
project.add_to_prelude <<-EOT
|
|
17
|
+
class MiniTest::Unit::TestCase
|
|
18
|
+
include RR::Adapters::MiniTest
|
|
19
|
+
end
|
|
20
|
+
EOT
|
|
21
|
+
end
|
|
22
|
+
project.add_test_file do |file|
|
|
23
|
+
file.add_working_test_case_with_adapter_tests do |test_case|
|
|
24
|
+
test_case.add_to_body <<-EOT
|
|
25
|
+
def test_the_correct_adapters_are_loaded
|
|
26
|
+
assert_adapters_loaded #{adapters_that_should_be_loaded.inspect}
|
|
27
|
+
end
|
|
28
|
+
EOT
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
result = project.run_tests
|
|
32
|
+
result.should be_success
|
|
33
|
+
result.should_not have_errors_or_failures
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.rr_hooks_into_the_test_framework_automatically
|
|
38
|
+
specify "RR hooks into the test framework automatically" do
|
|
39
|
+
project = generate_project
|
|
40
|
+
project.add_test_file do |file|
|
|
41
|
+
file.add_working_test_case
|
|
42
|
+
end
|
|
43
|
+
result = project.run_tests
|
|
44
|
+
result.should be_success
|
|
45
|
+
result.should_not have_errors_or_failures
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'when Bundler is autorequiring RR' do
|
|
50
|
+
def configure_project_generator(project_generator)
|
|
51
|
+
super
|
|
52
|
+
project_generator.configure do |project|
|
|
53
|
+
project.autorequire_gems = true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def adapters_that_should_be_loaded
|
|
58
|
+
[:MiniTest4]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
including_the_adapter_manually_works
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context 'when RR is being required manually' do
|
|
65
|
+
def configure_project_generator(project_generator)
|
|
66
|
+
super
|
|
67
|
+
project_generator.configure do |project|
|
|
68
|
+
project.autorequire_gems = false
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def adapters_that_should_be_loaded
|
|
73
|
+
[:MiniTest4]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
rr_hooks_into_the_test_framework_automatically
|
|
77
|
+
including_the_adapter_manually_works
|
|
78
|
+
|
|
79
|
+
specify "when RR raises an error it raises a failure not an exception" do
|
|
80
|
+
project = generate_project
|
|
81
|
+
project.add_test_file do |file|
|
|
82
|
+
file.add_test_case do |test_case|
|
|
83
|
+
test_case.add_test <<-EOT
|
|
84
|
+
object = Object.new
|
|
85
|
+
mock(object).foo
|
|
86
|
+
EOT
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
result = project.run_tests
|
|
90
|
+
result.should fail_with_output(/1 failure/)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
specify "throwing an error in teardown doesn't mess things up" do
|
|
94
|
+
project = generate_project
|
|
95
|
+
project.add_test_file do |file|
|
|
96
|
+
file.add_test_case do |test_case|
|
|
97
|
+
test_case.add_to_body <<-EOT
|
|
98
|
+
def teardown
|
|
99
|
+
raise 'hell'
|
|
100
|
+
end
|
|
101
|
+
EOT
|
|
102
|
+
test_case.add_test("") # doesn't matter
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
result = project.run_tests
|
|
106
|
+
result.should fail_with_output(/1 error/)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
require File.expand_path('../../spec_helper', __FILE__)
|
|
2
|
+
|
|
3
|
+
describe 'Integration with MiniTest >= 5' do
|
|
4
|
+
include IntegrationTests::RubyMinitest
|
|
5
|
+
|
|
6
|
+
def configure_project_generator(project_generator)
|
|
7
|
+
super
|
|
8
|
+
project_generator.configure do |project|
|
|
9
|
+
project.minitest_version = 5
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def self.including_the_adapter_manually_works
|
|
14
|
+
specify "including the adapter manually works" do
|
|
15
|
+
project = generate_project do |project|
|
|
16
|
+
project.add_to_prelude <<-EOT
|
|
17
|
+
class MiniTest::Unit::TestCase
|
|
18
|
+
include RR::Adapters::MiniTest
|
|
19
|
+
end
|
|
20
|
+
EOT
|
|
21
|
+
end
|
|
22
|
+
project.add_test_file do |file|
|
|
23
|
+
file.add_working_test_case_with_adapter_tests do |test_case|
|
|
24
|
+
test_case.add_to_body <<-EOT
|
|
25
|
+
def test_the_correct_adapters_are_loaded
|
|
26
|
+
assert_adapters_loaded #{adapters_that_should_be_loaded.inspect}
|
|
27
|
+
end
|
|
28
|
+
EOT
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
result = project.run_tests
|
|
32
|
+
result.should be_success
|
|
33
|
+
result.should_not have_errors_or_failures
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def self.rr_hooks_into_the_test_framework_automatically
|
|
38
|
+
specify "RR hooks into the test framework automatically" do
|
|
39
|
+
project = generate_project
|
|
40
|
+
project.add_test_file do |file|
|
|
41
|
+
file.add_working_test_case
|
|
42
|
+
end
|
|
43
|
+
result = project.run_tests
|
|
44
|
+
result.should be_success
|
|
45
|
+
result.should_not have_errors_or_failures
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
context 'when Bundler is autorequiring RR' do
|
|
50
|
+
def configure_project_generator(project_generator)
|
|
51
|
+
super
|
|
52
|
+
project_generator.configure do |project|
|
|
53
|
+
project.autorequire_gems = true
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def adapters_that_should_be_loaded
|
|
58
|
+
[:Minitest]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
including_the_adapter_manually_works
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
context 'when RR is being required manually' do
|
|
65
|
+
def configure_project_generator(project_generator)
|
|
66
|
+
super
|
|
67
|
+
project_generator.configure do |project|
|
|
68
|
+
project.autorequire_gems = false
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def adapters_that_should_be_loaded
|
|
73
|
+
[:Minitest]
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
rr_hooks_into_the_test_framework_automatically
|
|
77
|
+
including_the_adapter_manually_works
|
|
78
|
+
|
|
79
|
+
specify "when RR raises an error it raises a failure not an exception" do
|
|
80
|
+
project = generate_project
|
|
81
|
+
project.add_test_file do |file|
|
|
82
|
+
file.add_test_case do |test_case|
|
|
83
|
+
test_case.add_test <<-EOT
|
|
84
|
+
object = Object.new
|
|
85
|
+
mock(object).foo
|
|
86
|
+
EOT
|
|
87
|
+
end
|
|
88
|
+
end
|
|
89
|
+
result = project.run_tests
|
|
90
|
+
result.should fail_with_output(/1 failure/)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
specify "throwing an error in teardown doesn't mess things up" do
|
|
94
|
+
project = generate_project
|
|
95
|
+
project.add_test_file do |file|
|
|
96
|
+
file.add_test_case do |test_case|
|
|
97
|
+
test_case.add_to_body <<-EOT
|
|
98
|
+
def teardown
|
|
99
|
+
raise 'hell'
|
|
100
|
+
end
|
|
101
|
+
EOT
|
|
102
|
+
test_case.add_test("") # doesn't matter
|
|
103
|
+
end
|
|
104
|
+
end
|
|
105
|
+
result = project.run_tests
|
|
106
|
+
result.should fail_with_output(/1 error/)
|
|
107
|
+
end
|
|
108
|
+
end
|
|
109
|
+
end
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
module WildcardMatcherMatchers
|
|
2
|
+
extend RSpec::Matchers::DSL
|
|
3
|
+
|
|
4
|
+
matcher :equal_match do |value|
|
|
5
|
+
match { |matcher|
|
|
6
|
+
matcher == value &&
|
|
7
|
+
matcher.eql?(value)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
failure_message_for_should {
|
|
11
|
+
"Expected matcher to equal match #{value.inspect}, but it didn't"
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
failure_message_for_should_not {
|
|
15
|
+
"Expected matcher to not equal match #{value.inspect}, but it did"
|
|
16
|
+
}
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
matcher :wildcard_match do |value|
|
|
20
|
+
match { |matcher|
|
|
21
|
+
matcher.wildcard_match?(value)
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
failure_message_for_should {
|
|
25
|
+
"Expected matcher to wildcard equal match #{value.inspect}, but it didn't"
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
failure_message_for_should_not {
|
|
29
|
+
"Expected matcher to not wildcard equal match #{value.inspect}, but it did"
|
|
30
|
+
}
|
|
31
|
+
end
|
|
32
|
+
end
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
module DoubleDefinitionCreatorHelpers
|
|
2
|
+
module ClassMethods
|
|
3
|
+
def methods_being_doubled_exist_already?
|
|
4
|
+
metadata[:methods_exist] || supports_proxying? || supports_mocking?
|
|
5
|
+
end
|
|
6
|
+
|
|
7
|
+
def type_of_methods_being_tested
|
|
8
|
+
metadata[:method_type]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def supports_proxying?
|
|
12
|
+
metadata[:is_proxy]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def supports_instance_of?
|
|
16
|
+
metadata[:is_instance_of]
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def supports_mocking?
|
|
20
|
+
metadata[:is_mock]
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def supports_strong?
|
|
24
|
+
metadata[:is_strong]
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def supports_dont_allow?
|
|
28
|
+
metadata[:is_dont_allow]
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def self.included(base)
|
|
33
|
+
base.extend(ClassMethods)
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def build_object_with_possible_methods(methods = {}, actually_add_methods = methods_being_doubled_exist_already?)
|
|
37
|
+
subject =
|
|
38
|
+
if type_of_methods_being_tested == :class
|
|
39
|
+
Class.new
|
|
40
|
+
else
|
|
41
|
+
Object.new
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
if actually_add_methods
|
|
45
|
+
if supports_instance_of?
|
|
46
|
+
add_methods_to_class(subject, methods)
|
|
47
|
+
else
|
|
48
|
+
add_methods_to_class(subject.singleton_class, methods)
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
object =
|
|
53
|
+
if type_of_methods_being_tested == :class && supports_instance_of?
|
|
54
|
+
subject.new
|
|
55
|
+
else
|
|
56
|
+
subject
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
if block_given?
|
|
60
|
+
yield subject, object
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
object
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def build_object_with_methods(methods = {}, &block)
|
|
67
|
+
build_object_with_possible_methods(methods, true, &block)
|
|
68
|
+
end
|
|
69
|
+
alias_method :build_object, :build_object_with_methods
|
|
70
|
+
|
|
71
|
+
def add_methods_to_class(klass, methods)
|
|
72
|
+
klass.class_eval do
|
|
73
|
+
methods.each do |method_name, implementation|
|
|
74
|
+
implementation ||= ->(*args) { }
|
|
75
|
+
define_method(method_name, &implementation)
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
def expect_method_to_have_value_or_be_absent(return_value, object, method_name, *args, &block)
|
|
81
|
+
if methods_being_doubled_exist_already?
|
|
82
|
+
expect(object.__send__(method_name, *args, &block)).to eq return_value
|
|
83
|
+
else
|
|
84
|
+
expect_method_to_not_exist(object, method_name)
|
|
85
|
+
end
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
def expect_method_to_not_exist(object, method_name)
|
|
89
|
+
expect { object.method_name }.to raise_error(NoMethodError)
|
|
90
|
+
# Commenting this out for now since this is broken.
|
|
91
|
+
# See: btakita/rr #43
|
|
92
|
+
#expect(object).not_to respond_to(method_name)
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def build_object_with_doubled_method_which_is_called(original_value, new_value=nil, opts={}, &define_double)
|
|
96
|
+
method_name = :some_method
|
|
97
|
+
|
|
98
|
+
object = build_object_with_methods(method_name => -> { original_value }) do |subject|
|
|
99
|
+
double_creator = double_definition_creator_for(subject)
|
|
100
|
+
|
|
101
|
+
if define_double
|
|
102
|
+
define_double.call(double_creator, method_name, new_value)
|
|
103
|
+
else
|
|
104
|
+
double_creator.__send__(method_name)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
if opts[:before_method_call]
|
|
109
|
+
opts[:before_method_call].call
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
return_value = object.__send__(method_name)
|
|
113
|
+
[object, method_name, return_value]
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
def build_object_with_doubled_method_which_is_reset_and_called(original_value, new_value, opts={})
|
|
117
|
+
opts = opts.merge(before_method_call: -> { RR.reset })
|
|
118
|
+
build_object_with_doubled_method_which_is_called(original_value, new_value, opts)
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
def call_possible_method_on(object, method_name, *args, &block)
|
|
122
|
+
object.__send__(method_name, *args, &block)
|
|
123
|
+
rescue NoMethodError
|
|
124
|
+
end
|
|
125
|
+
|
|
126
|
+
def expect_call_to_return_or_raise_times_called_error(return_value, object, method_name, *args, &block)
|
|
127
|
+
if supports_dont_allow?
|
|
128
|
+
expect { object.__send__(method_name, *args, &block) }.
|
|
129
|
+
to raise_error(RR::Errors::TimesCalledError)
|
|
130
|
+
else
|
|
131
|
+
expect(object.__send__(method_name, *args, &block)).to eq return_value
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def call_method_rescuing_times_called_error(object, method_name, *args, &block)
|
|
136
|
+
if supports_dont_allow?
|
|
137
|
+
begin
|
|
138
|
+
object.__send__(method_name, *args, &block)
|
|
139
|
+
rescue RR::Errors::TimesCalledError
|
|
140
|
+
end
|
|
141
|
+
else
|
|
142
|
+
object.__send__(method_name, *args, &block)
|
|
143
|
+
end
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
def methods_being_doubled_exist_already?
|
|
147
|
+
self.class.methods_being_doubled_exist_already?
|
|
148
|
+
end
|
|
149
|
+
|
|
150
|
+
def type_of_methods_being_tested
|
|
151
|
+
self.class.type_of_methods_being_tested
|
|
152
|
+
end
|
|
153
|
+
|
|
154
|
+
def supports_proxying?
|
|
155
|
+
self.class.supports_proxying?
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
def supports_instance_of?
|
|
159
|
+
self.class.supports_instance_of?
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def supports_mocking?
|
|
163
|
+
self.class.supports_mocking?
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
def supports_strong?
|
|
167
|
+
self.class.supports_strong?
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def supports_dont_allow?
|
|
171
|
+
self.class.supports_dont_allow?
|
|
172
|
+
end
|
|
173
|
+
end
|