mocha 1.1.0 → 1.13.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/.github/FUNDING.yml +1 -0
- data/.rubocop.yml +61 -0
- data/.rubocop_todo.yml +27 -0
- data/.yardopts +1 -0
- data/CONTRIBUTING.md +4 -9
- data/README.md +114 -28
- data/RELEASE.md +248 -1
- data/Rakefile +53 -35
- data/gemfiles/Gemfile.test-unit.latest +5 -1
- data/init.rb +1 -3
- data/lib/mocha/any_instance_method.rb +12 -72
- data/lib/mocha/api.rb +121 -56
- data/lib/mocha/argument_iterator.rb +4 -8
- data/lib/mocha/backtrace_filter.rb +1 -5
- data/lib/mocha/block_matcher.rb +31 -0
- data/lib/mocha/cardinality.rb +60 -49
- data/lib/mocha/central.rb +21 -12
- data/lib/mocha/change_state_side_effect.rb +0 -4
- data/lib/mocha/class_methods.rb +19 -20
- data/lib/mocha/configuration.rb +361 -18
- data/lib/mocha/debug.rb +3 -2
- data/lib/mocha/deprecation.rb +8 -11
- data/lib/mocha/detection/mini_test.rb +0 -2
- data/lib/mocha/detection/test_unit.rb +3 -5
- data/lib/mocha/error_with_filtered_backtrace.rb +13 -0
- data/lib/mocha/exception_raiser.rb +4 -6
- data/lib/mocha/expectation.rb +125 -89
- data/lib/mocha/expectation_error.rb +1 -1
- data/lib/mocha/expectation_error_factory.rb +0 -1
- data/lib/mocha/expectation_list.rb +7 -11
- data/lib/mocha/hooks.rb +1 -3
- data/lib/mocha/in_state_ordering_constraint.rb +0 -4
- data/lib/mocha/inspect.rb +30 -38
- data/lib/mocha/instance_method.rb +15 -8
- data/lib/mocha/integration/mini_test/adapter.rb +2 -4
- data/lib/mocha/integration/mini_test/exception_translation.rb +1 -1
- data/lib/mocha/integration/mini_test/nothing.rb +4 -4
- data/lib/mocha/integration/mini_test/version_13.rb +4 -1
- data/lib/mocha/integration/mini_test/version_140.rb +4 -1
- data/lib/mocha/integration/mini_test/version_141.rb +4 -1
- data/lib/mocha/integration/mini_test/version_142_to_172.rb +4 -1
- data/lib/mocha/integration/mini_test/version_200.rb +4 -1
- data/lib/mocha/integration/mini_test/version_201_to_222.rb +4 -1
- data/lib/mocha/integration/mini_test/version_2110_to_2111.rb +4 -1
- data/lib/mocha/integration/mini_test/version_2112_to_320.rb +4 -1
- data/lib/mocha/integration/mini_test/version_230_to_2101.rb +4 -1
- data/lib/mocha/integration/mini_test.rb +7 -0
- data/lib/mocha/integration/monkey_patcher.rb +8 -2
- data/lib/mocha/integration/test_unit/adapter.rb +5 -6
- data/lib/mocha/integration/test_unit/gem_version_200.rb +5 -2
- data/lib/mocha/integration/test_unit/gem_version_201_to_202.rb +5 -2
- data/lib/mocha/integration/test_unit/gem_version_203_to_220.rb +5 -2
- data/lib/mocha/integration/test_unit/gem_version_230_to_250.rb +5 -2
- data/lib/mocha/integration/test_unit/nothing.rb +4 -4
- data/lib/mocha/integration/test_unit/ruby_version_185_and_below.rb +4 -1
- data/lib/mocha/integration/test_unit/ruby_version_186_and_above.rb +4 -1
- data/lib/mocha/integration/test_unit.rb +7 -0
- data/lib/mocha/integration.rb +2 -5
- data/lib/mocha/invocation.rb +77 -0
- data/lib/mocha/is_a.rb +0 -2
- data/lib/mocha/logger.rb +0 -4
- data/lib/mocha/macos_version.rb +5 -0
- data/lib/mocha/method_matcher.rb +1 -5
- data/lib/mocha/minitest.rb +8 -0
- data/lib/mocha/mock.rb +94 -46
- data/lib/mocha/mockery.rb +72 -98
- data/lib/mocha/names.rb +2 -12
- data/lib/mocha/not_initialized_error.rb +7 -0
- data/lib/mocha/object_methods.rb +25 -31
- data/lib/mocha/parameter_matchers/all_of.rb +2 -8
- data/lib/mocha/parameter_matchers/any_of.rb +2 -8
- data/lib/mocha/parameter_matchers/any_parameters.rb +3 -9
- data/lib/mocha/parameter_matchers/anything.rb +2 -8
- data/lib/mocha/parameter_matchers/base.rb +6 -12
- data/lib/mocha/parameter_matchers/equals.rb +1 -7
- data/lib/mocha/parameter_matchers/{query_string.rb → equivalent_uri.rb} +15 -15
- data/lib/mocha/parameter_matchers/has_entries.rb +2 -7
- data/lib/mocha/parameter_matchers/has_entry.rb +26 -21
- data/lib/mocha/parameter_matchers/has_key.rb +2 -7
- data/lib/mocha/parameter_matchers/has_keys.rb +53 -0
- data/lib/mocha/parameter_matchers/has_value.rb +2 -7
- data/lib/mocha/parameter_matchers/includes.rb +50 -8
- data/lib/mocha/parameter_matchers/instance_methods.rb +18 -0
- data/lib/mocha/parameter_matchers/instance_of.rb +0 -6
- data/lib/mocha/parameter_matchers/is_a.rb +2 -7
- data/lib/mocha/parameter_matchers/kind_of.rb +2 -6
- data/lib/mocha/parameter_matchers/not.rb +2 -7
- data/lib/mocha/parameter_matchers/optionally.rb +4 -10
- data/lib/mocha/parameter_matchers/regexp_matches.rb +0 -6
- data/lib/mocha/parameter_matchers/responds_with.rb +3 -8
- data/lib/mocha/parameter_matchers/yaml_equivalent.rb +2 -6
- data/lib/mocha/parameter_matchers.rb +3 -4
- data/lib/mocha/parameters_matcher.rb +6 -9
- data/lib/mocha/raised_exception.rb +11 -0
- data/lib/mocha/receivers.rb +10 -14
- data/lib/mocha/return_values.rb +4 -8
- data/lib/mocha/ruby_version.rb +4 -0
- data/lib/mocha/sequence.rb +4 -9
- data/lib/mocha/setup.rb +5 -0
- data/lib/mocha/single_return_value.rb +2 -5
- data/lib/mocha/singleton_class.rb +9 -0
- data/lib/mocha/state_machine.rb +33 -46
- data/lib/mocha/stubbed_method.rb +125 -0
- data/lib/mocha/stubbing_error.rb +2 -13
- data/lib/mocha/test_unit.rb +7 -2
- data/lib/mocha/thrower.rb +4 -6
- data/lib/mocha/thrown_object.rb +12 -0
- data/lib/mocha/version.rb +1 -1
- data/lib/mocha/yield_parameters.rb +7 -17
- data/lib/mocha.rb +8 -0
- data/mocha.gemspec +42 -40
- data/yard-templates/default/layout/html/google_analytics.erb +6 -9
- data/yard-templates/default/layout/html/setup.rb +2 -3
- metadata +45 -191
- data/bin/build-matrix +0 -71
- data/gemfiles/Gemfile.minitest.1.3.0 +0 -7
- data/gemfiles/Gemfile.minitest.1.4.0 +0 -7
- data/gemfiles/Gemfile.minitest.1.4.1 +0 -7
- data/gemfiles/Gemfile.minitest.1.4.2 +0 -7
- data/gemfiles/Gemfile.minitest.2.0.0 +0 -7
- data/gemfiles/Gemfile.minitest.2.0.1 +0 -7
- data/gemfiles/Gemfile.minitest.2.11.0 +0 -7
- data/gemfiles/Gemfile.minitest.2.11.2 +0 -7
- data/gemfiles/Gemfile.minitest.2.3.0 +0 -7
- data/gemfiles/Gemfile.test-unit.2.0.0 +0 -7
- data/gemfiles/Gemfile.test-unit.2.0.1 +0 -7
- data/gemfiles/Gemfile.test-unit.2.0.3 +0 -7
- data/lib/mocha/class_method.rb +0 -127
- data/lib/mocha/mini_test.rb +0 -3
- data/lib/mocha/module_method.rb +0 -16
- data/lib/mocha/module_methods.rb +0 -14
- data/lib/mocha/multiple_yields.rb +0 -20
- data/lib/mocha/no_yields.rb +0 -11
- data/lib/mocha/parameter_matchers/object.rb +0 -17
- data/lib/mocha/pretty_parameters.rb +0 -28
- data/lib/mocha/single_yield.rb +0 -18
- data/lib/mocha/standalone.rb +0 -4
- data/lib/mocha/unexpected_invocation.rb +0 -26
- data/lib/mocha_standalone.rb +0 -4
- data/test/acceptance/acceptance_test_helper.rb +0 -41
- data/test/acceptance/bug_18914_test.rb +0 -43
- data/test/acceptance/bug_21465_test.rb +0 -34
- data/test/acceptance/bug_21563_test.rb +0 -25
- data/test/acceptance/exception_rescue_test.rb +0 -55
- data/test/acceptance/expectations_on_multiple_methods_test.rb +0 -55
- data/test/acceptance/expected_invocation_count_test.rb +0 -232
- data/test/acceptance/failure_messages_test.rb +0 -64
- data/test/acceptance/issue_65_test.rb +0 -63
- data/test/acceptance/issue_70_test.rb +0 -55
- data/test/acceptance/mocha_example_test.rb +0 -98
- data/test/acceptance/mocha_test_result_test.rb +0 -84
- data/test/acceptance/mock_test.rb +0 -100
- data/test/acceptance/mock_with_initializer_block_test.rb +0 -51
- data/test/acceptance/mocked_methods_dispatch_test.rb +0 -78
- data/test/acceptance/multiple_expectations_failure_message_test.rb +0 -68
- data/test/acceptance/optional_parameters_test.rb +0 -70
- data/test/acceptance/parameter_matcher_test.rb +0 -337
- data/test/acceptance/partial_mocks_test.rb +0 -47
- data/test/acceptance/prepend_test.rb +0 -88
- data/test/acceptance/raise_exception_test.rb +0 -39
- data/test/acceptance/return_value_test.rb +0 -52
- data/test/acceptance/sequence_test.rb +0 -192
- data/test/acceptance/states_test.rb +0 -70
- data/test/acceptance/stub_any_instance_method_defined_on_superclass_test.rb +0 -34
- data/test/acceptance/stub_any_instance_method_test.rb +0 -238
- data/test/acceptance/stub_class_method_defined_on_active_record_association_proxy_test.rb +0 -106
- data/test/acceptance/stub_class_method_defined_on_class_test.rb +0 -78
- data/test/acceptance/stub_class_method_defined_on_module_test.rb +0 -75
- data/test/acceptance/stub_class_method_defined_on_superclass_test.rb +0 -112
- data/test/acceptance/stub_everything_test.rb +0 -56
- data/test/acceptance/stub_instance_method_defined_on_active_record_association_proxy_test.rb +0 -93
- data/test/acceptance/stub_instance_method_defined_on_class_and_aliased_test.rb +0 -69
- data/test/acceptance/stub_instance_method_defined_on_class_test.rb +0 -69
- data/test/acceptance/stub_instance_method_defined_on_kernel_module_test.rb +0 -75
- data/test/acceptance/stub_instance_method_defined_on_module_test.rb +0 -75
- data/test/acceptance/stub_instance_method_defined_on_object_class_test.rb +0 -75
- data/test/acceptance/stub_instance_method_defined_on_singleton_class_test.rb +0 -70
- data/test/acceptance/stub_instance_method_defined_on_superclass_test.rb +0 -72
- data/test/acceptance/stub_module_method_test.rb +0 -163
- data/test/acceptance/stub_test.rb +0 -52
- data/test/acceptance/stubba_example_test.rb +0 -102
- data/test/acceptance/stubba_test_result_test.rb +0 -66
- data/test/acceptance/stubbing_error_backtrace_test.rb +0 -64
- data/test/acceptance/stubbing_frozen_object_test.rb +0 -88
- data/test/acceptance/stubbing_method_accepting_block_parameter_test.rb +0 -48
- data/test/acceptance/stubbing_method_unnecessarily_test.rb +0 -65
- data/test/acceptance/stubbing_nil_test.rb +0 -59
- data/test/acceptance/stubbing_non_existent_any_instance_method_test.rb +0 -130
- data/test/acceptance/stubbing_non_existent_class_method_test.rb +0 -157
- data/test/acceptance/stubbing_non_existent_instance_method_test.rb +0 -147
- data/test/acceptance/stubbing_non_public_any_instance_method_test.rb +0 -130
- data/test/acceptance/stubbing_non_public_class_method_test.rb +0 -163
- data/test/acceptance/stubbing_non_public_instance_method_test.rb +0 -143
- data/test/acceptance/stubbing_on_non_mock_object_test.rb +0 -64
- data/test/acceptance/stubbing_same_class_method_on_parent_and_child_classes_test.rb +0 -35
- data/test/acceptance/throw_test.rb +0 -45
- data/test/acceptance/unexpected_invocation_test.rb +0 -25
- data/test/acceptance/unstubbing_test.rb +0 -168
- data/test/assertions.rb +0 -6
- data/test/deprecation_disabler.rb +0 -15
- data/test/execution_point.rb +0 -36
- data/test/integration/mini_test_test.rb +0 -8
- data/test/integration/shared_tests.rb +0 -174
- data/test/integration/test_unit_test.rb +0 -8
- data/test/method_definer.rb +0 -24
- data/test/mini_test_result.rb +0 -90
- data/test/minitest_result.rb +0 -49
- data/test/simple_counter.rb +0 -13
- data/test/test_helper.rb +0 -50
- data/test/test_runner.rb +0 -58
- data/test/test_unit_result.rb +0 -20
- data/test/unit/any_instance_method_test.rb +0 -132
- data/test/unit/array_inspect_test.rb +0 -16
- data/test/unit/backtrace_filter_test.rb +0 -19
- data/test/unit/cardinality_test.rb +0 -56
- data/test/unit/central_test.rb +0 -100
- data/test/unit/change_state_side_effect_test.rb +0 -41
- data/test/unit/class_method_test.rb +0 -223
- data/test/unit/class_methods_test.rb +0 -40
- data/test/unit/configuration_test.rb +0 -38
- data/test/unit/date_time_inspect_test.rb +0 -21
- data/test/unit/exception_raiser_test.rb +0 -42
- data/test/unit/expectation_list_test.rb +0 -82
- data/test/unit/expectation_test.rb +0 -497
- data/test/unit/hash_inspect_test.rb +0 -16
- data/test/unit/hooks_test.rb +0 -29
- data/test/unit/in_state_ordering_constraint_test.rb +0 -43
- data/test/unit/method_matcher_test.rb +0 -28
- data/test/unit/mock_test.rb +0 -341
- data/test/unit/mockery_test.rb +0 -151
- data/test/unit/module_methods_test.rb +0 -19
- data/test/unit/multiple_yields_test.rb +0 -18
- data/test/unit/no_yields_test.rb +0 -18
- data/test/unit/object_inspect_test.rb +0 -38
- data/test/unit/object_methods_test.rb +0 -46
- data/test/unit/parameter_matchers/all_of_test.rb +0 -26
- data/test/unit/parameter_matchers/any_of_test.rb +0 -26
- data/test/unit/parameter_matchers/anything_test.rb +0 -21
- data/test/unit/parameter_matchers/equals_test.rb +0 -25
- data/test/unit/parameter_matchers/has_entries_test.rb +0 -51
- data/test/unit/parameter_matchers/has_entry_test.rb +0 -129
- data/test/unit/parameter_matchers/has_key_test.rb +0 -55
- data/test/unit/parameter_matchers/has_value_test.rb +0 -57
- data/test/unit/parameter_matchers/includes_test.rb +0 -59
- data/test/unit/parameter_matchers/instance_of_test.rb +0 -25
- data/test/unit/parameter_matchers/is_a_test.rb +0 -25
- data/test/unit/parameter_matchers/kind_of_test.rb +0 -25
- data/test/unit/parameter_matchers/not_test.rb +0 -26
- data/test/unit/parameter_matchers/regexp_matches_test.rb +0 -46
- data/test/unit/parameter_matchers/responds_with_test.rb +0 -32
- data/test/unit/parameter_matchers/stub_matcher.rb +0 -27
- data/test/unit/parameter_matchers/yaml_equivalent_test.rb +0 -25
- data/test/unit/parameters_matcher_test.rb +0 -121
- data/test/unit/receivers_test.rb +0 -66
- data/test/unit/return_values_test.rb +0 -63
- data/test/unit/sequence_test.rb +0 -104
- data/test/unit/single_return_value_test.rb +0 -14
- data/test/unit/single_yield_test.rb +0 -18
- data/test/unit/state_machine_test.rb +0 -98
- data/test/unit/string_inspect_test.rb +0 -11
- data/test/unit/thrower_test.rb +0 -20
- data/test/unit/yield_parameters_test.rb +0 -93
data/Rakefile
CHANGED
@@ -1,15 +1,15 @@
|
|
1
|
-
require
|
1
|
+
require 'bundler'
|
2
2
|
Bundler::GemHelper.install_tasks
|
3
|
-
require
|
3
|
+
require 'bundler/setup'
|
4
4
|
|
5
5
|
require 'rake/testtask'
|
6
6
|
|
7
|
-
desc
|
7
|
+
desc 'Run all tests'
|
8
8
|
task 'default' => ['test', 'test:performance']
|
9
9
|
|
10
|
-
desc
|
10
|
+
desc 'Run tests'
|
11
11
|
task 'test' do
|
12
|
-
if test_library = ENV['MOCHA_RUN_INTEGRATION_TESTS']
|
12
|
+
if (test_library = ENV['MOCHA_RUN_INTEGRATION_TESTS'])
|
13
13
|
Rake::Task["test:integration:#{test_library}"].invoke
|
14
14
|
else
|
15
15
|
Rake::Task['test:units'].invoke
|
@@ -17,14 +17,13 @@ task 'test' do
|
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
-
namespace 'test' do
|
21
|
-
|
20
|
+
namespace 'test' do # rubocop:disable Metrics/BlockLength
|
22
21
|
unit_tests = FileList['test/unit/**/*_test.rb']
|
23
22
|
all_acceptance_tests = FileList['test/acceptance/*_test.rb']
|
24
23
|
ruby186_incompatible_acceptance_tests = FileList['test/acceptance/stub_class_method_defined_on_*_test.rb'] + FileList['test/acceptance/stub_instance_method_defined_on_*_test.rb']
|
25
24
|
ruby186_compatible_acceptance_tests = all_acceptance_tests - ruby186_incompatible_acceptance_tests
|
26
25
|
|
27
|
-
desc
|
26
|
+
desc 'Run unit tests'
|
28
27
|
Rake::TestTask.new('units') do |t|
|
29
28
|
t.libs << 'test'
|
30
29
|
t.test_files = unit_tests
|
@@ -32,20 +31,20 @@ namespace 'test' do
|
|
32
31
|
t.warning = true
|
33
32
|
end
|
34
33
|
|
35
|
-
desc
|
34
|
+
desc 'Run acceptance tests'
|
36
35
|
Rake::TestTask.new('acceptance') do |t|
|
37
36
|
t.libs << 'test'
|
38
|
-
if defined?(RUBY_VERSION) && (RUBY_VERSION >=
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
37
|
+
t.test_files = if defined?(RUBY_VERSION) && (RUBY_VERSION >= '1.8.7')
|
38
|
+
all_acceptance_tests
|
39
|
+
else
|
40
|
+
ruby186_compatible_acceptance_tests
|
41
|
+
end
|
43
42
|
t.verbose = true
|
44
43
|
t.warning = true
|
45
44
|
end
|
46
45
|
|
47
46
|
namespace 'integration' do
|
48
|
-
desc
|
47
|
+
desc 'Run MiniTest integration tests (intended to be run in its own process)'
|
49
48
|
Rake::TestTask.new('minitest') do |t|
|
50
49
|
t.libs << 'test'
|
51
50
|
t.test_files = FileList['test/integration/mini_test_test.rb']
|
@@ -53,7 +52,7 @@ namespace 'test' do
|
|
53
52
|
t.warning = true
|
54
53
|
end
|
55
54
|
|
56
|
-
desc
|
55
|
+
desc 'Run Test::Unit integration tests (intended to be run in its own process)'
|
57
56
|
Rake::TestTask.new('test-unit') do |t|
|
58
57
|
t.libs << 'test'
|
59
58
|
t.test_files = FileList['test/integration/test_unit_test.rb']
|
@@ -72,7 +71,7 @@ namespace 'test' do
|
|
72
71
|
# t.rcov_opts << '--xref'
|
73
72
|
# end
|
74
73
|
|
75
|
-
desc
|
74
|
+
desc 'Run performance tests'
|
76
75
|
task 'performance' do
|
77
76
|
require File.join(File.dirname(__FILE__), 'test', 'acceptance', 'stubba_example_test')
|
78
77
|
require File.join(File.dirname(__FILE__), 'test', 'acceptance', 'mocha_example_test')
|
@@ -82,35 +81,53 @@ namespace 'test' do
|
|
82
81
|
puts "#{test_case}: #{benchmark_test_case(test_case, iterations)} seconds."
|
83
82
|
end
|
84
83
|
end
|
84
|
+
end
|
85
85
|
|
86
|
+
begin
|
87
|
+
require 'rubocop/rake_task'
|
88
|
+
if RUBY_VERSION >= '2.2.0' && (defined?(RUBY_ENGINE) && RUBY_ENGINE == 'ruby') && ENV['MOCHA_RUN_INTEGRATION_TESTS'].nil?
|
89
|
+
RuboCop::RakeTask.new
|
90
|
+
task 'test' => 'rubocop'
|
91
|
+
end
|
92
|
+
rescue LoadError # rubocop:disable Lint/HandleExceptions
|
86
93
|
end
|
87
94
|
|
95
|
+
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
88
96
|
def benchmark_test_case(klass, iterations)
|
89
97
|
require 'benchmark'
|
98
|
+
require 'mocha/detection/mini_test'
|
90
99
|
|
91
100
|
if defined?(MiniTest)
|
92
|
-
|
93
|
-
|
101
|
+
minitest_version = Gem::Version.new(Mocha::Detection::MiniTest.version)
|
102
|
+
if Gem::Requirement.new('>= 5.0.0').satisfied_by?(minitest_version)
|
103
|
+
result = Benchmark.realtime { iterations.times { |_i| klass.run(MiniTest::CompositeReporter.new) } }
|
104
|
+
MiniTest::Runnable.runnables.delete(klass)
|
105
|
+
result
|
106
|
+
else
|
107
|
+
MiniTest::Unit.output = StringIO.new
|
108
|
+
Benchmark.realtime { iterations.times { |_i| MiniTest::Unit.new.run([klass]) } }
|
109
|
+
end
|
94
110
|
else
|
95
111
|
load 'test/unit/ui/console/testrunner.rb' unless defined?(Test::Unit::UI::Console::TestRunner)
|
96
|
-
unless
|
112
|
+
unless @silent_option
|
97
113
|
begin
|
98
114
|
load 'test/unit/ui/console/outputlevel.rb' unless defined?(Test::Unit::UI::Console::OutputLevel::SILENT)
|
99
|
-
|
115
|
+
@silent_option = { :output_level => Test::Unit::UI::Console::OutputLevel::SILENT }
|
100
116
|
rescue LoadError
|
101
|
-
|
117
|
+
@silent_option = Test::Unit::UI::SILENT
|
102
118
|
end
|
103
119
|
end
|
104
|
-
Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass,
|
120
|
+
Benchmark.realtime { iterations.times { Test::Unit::UI::Console::TestRunner.run(klass, @silent_option) } }
|
105
121
|
end
|
106
122
|
end
|
123
|
+
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
107
124
|
|
108
|
-
|
125
|
+
if ENV['MOCHA_GENERATE_DOCS']
|
109
126
|
require 'yard'
|
110
127
|
|
111
128
|
desc 'Remove generated documentation'
|
112
129
|
task 'clobber_yardoc' do
|
113
|
-
`rm -rf ./
|
130
|
+
`rm -rf ./docs`
|
114
131
|
end
|
115
132
|
|
116
133
|
task 'docs_environment' do
|
@@ -121,19 +138,20 @@ unless ENV["MOCHA_NO_DOCS"]
|
|
121
138
|
|
122
139
|
desc 'Generate documentation'
|
123
140
|
YARD::Rake::YardocTask.new('yardoc' => 'docs_environment') do |task|
|
124
|
-
task.options = [
|
141
|
+
task.options = ['--title', "Mocha #{Mocha::VERSION}", '--fail-on-warning']
|
125
142
|
end
|
126
143
|
|
127
|
-
|
128
|
-
|
144
|
+
task 'checkout_docs_cname' do
|
145
|
+
`git checkout docs/CNAME`
|
146
|
+
end
|
129
147
|
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
system %{ssh gofreerange.com "sudo rm -fr #{path} && mkdir -p #{path}" && scp -r doc/* gofreerange.com:#{path}}
|
148
|
+
task 'checkout_docs_js' do
|
149
|
+
`git checkout docs/js/app.js`
|
150
|
+
`git checkout docs/js/jquery.js`
|
134
151
|
end
|
135
|
-
end
|
136
152
|
|
137
|
-
|
138
|
-
|
153
|
+
desc 'Generate documentation'
|
154
|
+
task 'generate_docs' => %w[clobber_yardoc yardoc checkout_docs_cname checkout_docs_js]
|
139
155
|
end
|
156
|
+
|
157
|
+
task 'release' => 'default'
|
data/init.rb
CHANGED
@@ -1,3 +1 @@
|
|
1
|
-
|
2
|
-
# You should explicitly load Mocha *after* Test::Unit or MiniTest have been loaded
|
3
|
-
# e.g. by adding "require 'mocha'" at the bottom of test/test_helper.rb
|
1
|
+
warn 'Mocha deprecation warning: The old-style Rails plugin will not be supported in future versions of Mocha.'
|
@@ -1,84 +1,24 @@
|
|
1
|
-
require 'mocha/
|
1
|
+
require 'mocha/ruby_version'
|
2
|
+
require 'mocha/stubbed_method'
|
2
3
|
|
3
4
|
module Mocha
|
5
|
+
class AnyInstanceMethod < StubbedMethod
|
6
|
+
private
|
4
7
|
|
5
|
-
|
6
|
-
|
7
|
-
def mock
|
8
|
-
stubbee.any_instance.mocha
|
9
|
-
end
|
10
|
-
|
11
|
-
def reset_mocha
|
12
|
-
stubbee.any_instance.reset_mocha
|
13
|
-
end
|
14
|
-
|
15
|
-
def hide_original_method
|
16
|
-
if method_exists?(method)
|
17
|
-
begin
|
18
|
-
@original_method = stubbee.instance_method(method)
|
19
|
-
if @original_method && @original_method.owner == stubbee
|
20
|
-
@original_visibility = :public
|
21
|
-
if stubbee.protected_instance_methods.include?(method)
|
22
|
-
@original_visibility = :protected
|
23
|
-
elsif stubbee.private_instance_methods.include?(method)
|
24
|
-
@original_visibility = :private
|
25
|
-
end
|
26
|
-
stubbee.send(:remove_method, method)
|
27
|
-
end
|
28
|
-
|
29
|
-
include_prepended_module if RUBY_VERSION >= '2.0'
|
30
|
-
rescue NameError
|
31
|
-
# deal with nasties like ActiveRecord::Associations::AssociationProxy
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
|
36
|
-
def define_new_method
|
37
|
-
definition_target.class_eval(<<-CODE, __FILE__, __LINE__ + 1)
|
38
|
-
def #{method}(*args, &block)
|
39
|
-
self.class.any_instance.mocha.method_missing(:#{method}, *args, &block)
|
40
|
-
end
|
41
|
-
CODE
|
42
|
-
if @original_visibility
|
43
|
-
Module.instance_method(@original_visibility).bind(definition_target).call(method)
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def remove_new_method
|
48
|
-
definition_target.send(:remove_method, method)
|
8
|
+
def mock_owner
|
9
|
+
stubbee.any_instance
|
49
10
|
end
|
50
11
|
|
51
|
-
def
|
52
|
-
|
53
|
-
stubbee.send(:define_method, method, @original_method)
|
54
|
-
Module.instance_method(@original_visibility).bind(stubbee).call(method)
|
55
|
-
end
|
12
|
+
def method_body(method)
|
13
|
+
method
|
56
14
|
end
|
57
15
|
|
58
|
-
def
|
59
|
-
|
60
|
-
return true if stubbee.protected_instance_methods(false).include?(method)
|
61
|
-
return true if stubbee.private_instance_methods(false).include?(method)
|
62
|
-
return false
|
16
|
+
def stubbee_method(method_name)
|
17
|
+
stubbee.instance_method(method_name)
|
63
18
|
end
|
64
19
|
|
65
|
-
|
66
|
-
|
67
|
-
def include_prepended_module
|
68
|
-
possible_prepended_modules = stubbee.ancestors.take_while do |mod|
|
69
|
-
!(Class === mod)
|
70
|
-
end
|
71
|
-
|
72
|
-
if possible_prepended_modules.any?
|
73
|
-
@definition_target = PrependedModule.new
|
74
|
-
stubbee.__send__ :prepend, @definition_target
|
75
|
-
end
|
20
|
+
def original_method_owner
|
21
|
+
stubbee
|
76
22
|
end
|
77
|
-
|
78
|
-
def definition_target
|
79
|
-
@definition_target ||= stubbee
|
80
|
-
end
|
81
|
-
|
82
23
|
end
|
83
|
-
|
84
24
|
end
|
data/lib/mocha/api.rb
CHANGED
@@ -3,34 +3,60 @@ require 'mocha/hooks'
|
|
3
3
|
require 'mocha/mockery'
|
4
4
|
require 'mocha/sequence'
|
5
5
|
require 'mocha/object_methods'
|
6
|
-
require 'mocha/module_methods'
|
7
6
|
require 'mocha/class_methods'
|
8
7
|
|
9
8
|
module Mocha
|
10
|
-
|
11
9
|
# Methods added to +Test::Unit::TestCase+, +MiniTest::Unit::TestCase+ or equivalent.
|
10
|
+
# The mock creation methods are {#mock}, {#stub} and {#stub_everything}, all of which return a #{Mock}
|
11
|
+
# which can be further modified by {Mock#responds_like} and {Mock#responds_like_instance_of} methods,
|
12
|
+
# both of which return a {Mock}, too, and can therefore, be chained to the original creation methods.
|
13
|
+
#
|
14
|
+
# {Mock#responds_like} and {Mock#responds_like_instance_of} force the mock to indicate what it is
|
15
|
+
# supposed to be mocking, thus making it a safer verifying mock. They check that the underlying +responder+
|
16
|
+
# will actually respond to the methods being stubbed, throwing a +NoMethodError+ upon invocation otherwise.
|
17
|
+
#
|
18
|
+
# @example Verifying mock using {Mock#responds_like_instance_of}
|
19
|
+
# class Sheep
|
20
|
+
# def initialize
|
21
|
+
# raise "some awkward code we don't want to call"
|
22
|
+
# end
|
23
|
+
# def chew(grass); end
|
24
|
+
# end
|
25
|
+
#
|
26
|
+
# sheep = mock('sheep').responds_like_instance_of(Sheep)
|
27
|
+
# sheep.expects(:chew)
|
28
|
+
# sheep.expects(:foo)
|
29
|
+
# sheep.respond_to?(:chew) # => true
|
30
|
+
# sheep.respond_to?(:foo) # => false
|
31
|
+
# sheep.chew
|
32
|
+
# sheep.foo # => raises NoMethodError exception
|
12
33
|
module API
|
13
|
-
|
14
34
|
include ParameterMatchers
|
15
35
|
include Hooks
|
16
36
|
|
17
37
|
# @private
|
18
|
-
def self.included(
|
38
|
+
def self.included(_mod)
|
19
39
|
Object.send(:include, Mocha::ObjectMethods)
|
20
|
-
Module.send(:include, Mocha::ModuleMethods)
|
21
40
|
Class.send(:include, Mocha::ClassMethods)
|
22
41
|
end
|
23
42
|
|
43
|
+
# @private
|
44
|
+
def self.extended(mod)
|
45
|
+
included(mod)
|
46
|
+
end
|
47
|
+
|
24
48
|
# Builds a new mock object
|
25
49
|
#
|
26
|
-
# @param [String] name identifies mock object in error messages.
|
27
|
-
# @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {Mock#expects} were called multiple times.
|
28
|
-
# @yield optional block to be evaluated against the mock object instance, giving an alternative way to setup expectations.
|
29
50
|
# @return [Mock] a new mock object
|
30
51
|
#
|
31
|
-
# @overload def mock(name
|
32
|
-
#
|
33
|
-
#
|
52
|
+
# @overload def mock(name)
|
53
|
+
# @param [String, Symbol] name identifies mock object in error messages.
|
54
|
+
# @note Prior to v1.10.0 when +name+ was a +Symbol+, this method returned an unnamed +Mock+ that expected the method identified by +name+. This was undocumented behaviour and it will be removed in the future, but for the moment it can be reinstated using {Configuration#reinstate_undocumented_behaviour_from_v1_9=}.
|
55
|
+
# @overload def mock(expected_methods_vs_return_values = {})
|
56
|
+
# @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {Mock#expects} were called multiple times.
|
57
|
+
# @overload def mock(name, expected_methods_vs_return_values = {})
|
58
|
+
# @param [String, Symbol] name identifies mock object in error messages.
|
59
|
+
# @param [Hash] expected_methods_vs_return_values expected method name symbols as keys and corresponding return values as values - these expectations are setup as if {Mock#expects} were called multiple times.
|
34
60
|
#
|
35
61
|
# @example Using expected_methods_vs_return_values Hash to setup expectations.
|
36
62
|
# def test_motor_starts_and_stops
|
@@ -39,71 +65,92 @@ module Mocha
|
|
39
65
|
# assert motor.stop
|
40
66
|
# # an error will be raised unless both Motor#start and Motor#stop have been called
|
41
67
|
# end
|
42
|
-
#
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
68
|
+
#
|
69
|
+
def mock(*arguments) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
70
|
+
if Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
|
71
|
+
if arguments.first.is_a?(Symbol)
|
72
|
+
method_name = arguments[0]
|
73
|
+
Deprecation.warning(
|
74
|
+
"Explicitly include `#{method_name}` in Hash of expected methods vs return values,",
|
75
|
+
" e.g. `mock(:#{method_name} => nil)`."
|
76
|
+
)
|
77
|
+
if arguments[1]
|
78
|
+
Deprecation.warning(
|
79
|
+
"In this case the 2nd argument for `mock(:##{method_name}, ...)` is ignored,",
|
80
|
+
' but in the future a Hash of expected methods vs return values will be respected.'
|
81
|
+
)
|
82
|
+
end
|
83
|
+
elsif arguments.first.is_a?(String)
|
84
|
+
name = arguments.shift
|
85
|
+
end
|
86
|
+
elsif arguments.first.is_a?(String) || arguments.first.is_a?(Symbol)
|
87
|
+
name = arguments.shift
|
88
|
+
end
|
54
89
|
expectations = arguments.shift || {}
|
55
|
-
mock = name ? Mockery.instance.named_mock(name
|
90
|
+
mock = name ? Mockery.instance.named_mock(name) : Mockery.instance.unnamed_mock
|
56
91
|
mock.expects(expectations)
|
57
92
|
mock
|
58
93
|
end
|
59
94
|
|
60
95
|
# Builds a new mock object
|
61
96
|
#
|
62
|
-
# @param [String] name identifies mock object in error messages.
|
63
|
-
# @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {Mock#stubs} were called multiple times.
|
64
|
-
# @yield optional block to be evaluated against the mock object instance, giving an alternative way to setup stubbed methods.
|
65
97
|
# @return [Mock] a new mock object
|
66
98
|
#
|
67
|
-
# @overload def stub(name
|
68
|
-
#
|
69
|
-
#
|
99
|
+
# @overload def stub(name)
|
100
|
+
# @param [String, Symbol] name identifies mock object in error messages.
|
101
|
+
# @note Prior to v1.10.0 when +name+ was a +Symbol+, this method returned an unnamed +Mock+ that stubbed the method identified by +name+. This was undocumented behaviour and it will be removed in the future, but for the moment it can be reinstated using {Configuration#reinstate_undocumented_behaviour_from_v1_9=}.
|
102
|
+
# @overload def stub(stubbed_methods_vs_return_values = {})
|
103
|
+
# @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {Mock#stubs} were called multiple times.
|
104
|
+
# @overload def stub(name, stubbed_methods_vs_return_values = {})
|
105
|
+
# @param [String, Symbol] name identifies mock object in error messages.
|
70
106
|
#
|
71
107
|
# @example Using stubbed_methods_vs_return_values Hash to setup stubbed methods.
|
72
108
|
# def test_motor_starts_and_stops
|
73
|
-
# motor =
|
109
|
+
# motor = stub('motor', :start => true, :stop => true)
|
74
110
|
# assert motor.start
|
75
111
|
# assert motor.stop
|
76
112
|
# # an error will not be raised even if either Motor#start or Motor#stop has not been called
|
77
113
|
# end
|
78
|
-
#
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
114
|
+
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
115
|
+
def stub(*arguments)
|
116
|
+
if Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
|
117
|
+
if arguments.first.is_a?(Symbol)
|
118
|
+
method_name = arguments[0]
|
119
|
+
Deprecation.warning(
|
120
|
+
"Explicitly include `#{method_name}` in Hash of stubbed methods vs return values,",
|
121
|
+
" e.g. `stub(:#{method_name} => nil)`."
|
122
|
+
)
|
123
|
+
if arguments[1]
|
124
|
+
Deprecation.warning(
|
125
|
+
"In this case the 2nd argument for `stub(:##{method_name}, ...)` is ignored,",
|
126
|
+
' but in the future a Hash of stubbed methods vs return values will be respected.'
|
127
|
+
)
|
128
|
+
end
|
129
|
+
elsif arguments.first.is_a?(String)
|
130
|
+
name = arguments.shift
|
131
|
+
end
|
132
|
+
elsif arguments.first.is_a?(String) || arguments.first.is_a?(Symbol)
|
133
|
+
name = arguments.shift
|
134
|
+
end
|
91
135
|
expectations = arguments.shift || {}
|
92
|
-
stub = name ? Mockery.instance.named_mock(name
|
136
|
+
stub = name ? Mockery.instance.named_mock(name) : Mockery.instance.unnamed_mock
|
93
137
|
stub.stubs(expectations)
|
94
138
|
stub
|
95
139
|
end
|
140
|
+
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
96
141
|
|
97
142
|
# Builds a mock object that accepts calls to any method. By default it will return +nil+ for any method call.
|
98
143
|
#
|
99
|
-
# @param [String] name identifies mock object in error messages.
|
100
|
-
# @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {Mock#stubs} were called multiple times.
|
101
|
-
# @yield optional block to be evaluated against the mock object instance, giving an alternative way to setup stubbed methods.
|
102
144
|
# @return [Mock] a new mock object
|
103
145
|
#
|
104
|
-
# @overload def stub_everything(name
|
105
|
-
#
|
106
|
-
#
|
146
|
+
# @overload def stub_everything(name)
|
147
|
+
# @param [String, Symbol] name identifies mock object in error messages.
|
148
|
+
# @note Prior to v1.10.0 when +name+ was a +Symbol+, this method returned an unnamed +Mock+ that stubbed the method identified by +name+. This was undocumented behaviour and it will be removed in the future, but for the moment it can be reinstated using {Configuration#reinstate_undocumented_behaviour_from_v1_9=}.
|
149
|
+
# @overload def stub_everything(stubbed_methods_vs_return_values = {})
|
150
|
+
# @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {Mock#stubs} were called multiple times.
|
151
|
+
# @overload def stub_everything(name, stubbed_methods_vs_return_values = {})
|
152
|
+
# @param [String, Symbol] name identifies mock object in error messages.
|
153
|
+
# @param [Hash] stubbed_methods_vs_return_values stubbed method name symbols as keys and corresponding return values as values - these stubbed methods are setup as if {Mock#stubs} were called multiple times.
|
107
154
|
#
|
108
155
|
# @example Ignore invocations of irrelevant methods.
|
109
156
|
# def test_motor_stops
|
@@ -112,14 +159,34 @@ module Mocha
|
|
112
159
|
# assert_nil motor.irrelevant_method_2 # => no error raised
|
113
160
|
# assert motor.stop
|
114
161
|
# end
|
115
|
-
|
116
|
-
|
162
|
+
# rubocop:disable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
163
|
+
def stub_everything(*arguments)
|
164
|
+
if Mocha.configuration.reinstate_undocumented_behaviour_from_v1_9?
|
165
|
+
if arguments.first.is_a?(Symbol)
|
166
|
+
method_name = arguments[0]
|
167
|
+
Deprecation.warning(
|
168
|
+
"Explicitly include `#{method_name}` in Hash of stubbed methods vs return values,",
|
169
|
+
" e.g. `stub_everything(:#{method_name} => nil)`."
|
170
|
+
)
|
171
|
+
if arguments[1]
|
172
|
+
Deprecation.warning(
|
173
|
+
"In this case the 2nd argument for `stub_everything(:##{method_name}, ...)` is ignored,",
|
174
|
+
' but in the future a Hash of stubbed methods vs return values will be respected.'
|
175
|
+
)
|
176
|
+
end
|
177
|
+
elsif arguments.first.is_a?(String)
|
178
|
+
name = arguments.shift
|
179
|
+
end
|
180
|
+
elsif arguments.first.is_a?(String) || arguments.first.is_a?(Symbol)
|
181
|
+
name = arguments.shift
|
182
|
+
end
|
117
183
|
expectations = arguments.shift || {}
|
118
|
-
stub = name ? Mockery.instance.named_mock(name
|
184
|
+
stub = name ? Mockery.instance.named_mock(name) : Mockery.instance.unnamed_mock
|
119
185
|
stub.stub_everything
|
120
186
|
stub.stubs(expectations)
|
121
187
|
stub
|
122
188
|
end
|
189
|
+
# rubocop:enable Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
123
190
|
|
124
191
|
# Builds a new sequence which can be used to constrain the order in which expectations can occur.
|
125
192
|
#
|
@@ -170,7 +237,5 @@ module Mocha
|
|
170
237
|
def states(name)
|
171
238
|
Mockery.instance.new_state_machine(name)
|
172
239
|
end
|
173
|
-
|
174
240
|
end
|
175
|
-
|
176
241
|
end
|
@@ -1,21 +1,17 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
class ArgumentIterator
|
4
|
-
|
5
3
|
def initialize(argument)
|
6
4
|
@argument = argument
|
7
5
|
end
|
8
6
|
|
9
|
-
def each
|
10
|
-
if @argument.is_a?(Hash)
|
7
|
+
def each
|
8
|
+
if @argument.is_a?(Hash)
|
11
9
|
@argument.each do |method_name, return_value|
|
12
|
-
|
10
|
+
yield method_name, return_value
|
13
11
|
end
|
14
12
|
else
|
15
|
-
|
13
|
+
yield @argument
|
16
14
|
end
|
17
15
|
end
|
18
|
-
|
19
16
|
end
|
20
|
-
|
21
17
|
end
|
@@ -1,8 +1,6 @@
|
|
1
1
|
module Mocha
|
2
|
-
|
3
2
|
class BacktraceFilter
|
4
|
-
|
5
|
-
LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), "..")) + File::SEPARATOR
|
3
|
+
LIB_DIRECTORY = File.expand_path(File.join(File.dirname(__FILE__), '..')) + File::SEPARATOR
|
6
4
|
|
7
5
|
def initialize(lib_directory = LIB_DIRECTORY)
|
8
6
|
@path_pattern = Regexp.new(lib_directory)
|
@@ -11,7 +9,5 @@ module Mocha
|
|
11
9
|
def filtered(backtrace)
|
12
10
|
backtrace.reject { |location| @path_pattern.match(File.expand_path(location)) }
|
13
11
|
end
|
14
|
-
|
15
12
|
end
|
16
|
-
|
17
13
|
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Mocha
|
2
|
+
module BlockMatchers
|
3
|
+
class OptionalBlock
|
4
|
+
def match?(_actual_block)
|
5
|
+
true
|
6
|
+
end
|
7
|
+
|
8
|
+
def mocha_inspect; end
|
9
|
+
end
|
10
|
+
|
11
|
+
class BlockGiven
|
12
|
+
def match?(actual_block)
|
13
|
+
!actual_block.nil?
|
14
|
+
end
|
15
|
+
|
16
|
+
def mocha_inspect
|
17
|
+
'with block given'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
class NoBlockGiven
|
22
|
+
def match?(actual_block)
|
23
|
+
actual_block.nil?
|
24
|
+
end
|
25
|
+
|
26
|
+
def mocha_inspect
|
27
|
+
'with no block given'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|