mocha 0.4.0 → 0.5.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.
- data/Rakefile +28 -10
- data/examples/stubba.rb +1 -1
- data/lib/mocha/auto_verify.rb +6 -6
- data/lib/mocha/deprecation.rb +22 -0
- data/lib/mocha/exception_raiser.rb +17 -0
- data/lib/mocha/expectation.rb +167 -84
- data/lib/mocha/infinite_range.rb +4 -6
- data/lib/mocha/inspect.rb +3 -1
- data/lib/mocha/is_a.rb +9 -0
- data/lib/mocha/missing_expectation.rb +27 -0
- data/lib/mocha/mock.rb +191 -5
- data/lib/mocha/multiple_yields.rb +20 -0
- data/lib/mocha/no_yields.rb +11 -0
- data/lib/mocha/object.rb +11 -1
- data/lib/mocha/parameter_matchers.rb +9 -0
- data/lib/mocha/parameter_matchers/all_of.rb +39 -0
- data/lib/mocha/parameter_matchers/any_of.rb +44 -0
- data/lib/mocha/parameter_matchers/anything.rb +30 -0
- data/lib/mocha/parameter_matchers/has_entry.rb +39 -0
- data/lib/mocha/parameter_matchers/has_key.rb +39 -0
- data/lib/mocha/parameter_matchers/has_value.rb +39 -0
- data/lib/mocha/parameter_matchers/includes.rb +37 -0
- data/lib/mocha/return_values.rb +31 -0
- data/lib/mocha/single_return_value.rb +24 -0
- data/lib/mocha/single_yield.rb +18 -0
- data/lib/mocha/standalone.rb +2 -0
- data/lib/mocha/stub.rb +18 -0
- data/lib/mocha/yield_parameters.rb +31 -0
- data/test/{mocha_acceptance_test.rb → acceptance/mocha_acceptance_test.rb} +1 -1
- data/test/acceptance/mocked_methods_dispatch_acceptance_test.rb +72 -0
- data/test/acceptance/parameter_matcher_acceptance_test.rb +63 -0
- data/test/{standalone_acceptance_test.rb → acceptance/standalone_acceptance_test.rb} +22 -1
- data/test/{stubba_acceptance_test.rb → acceptance/stubba_acceptance_test.rb} +1 -1
- data/test/deprecation_disabler.rb +15 -0
- data/test/{mocha_test_result_integration_test.rb → integration/mocha_test_result_integration_test.rb} +1 -1
- data/test/{stubba_integration_test.rb → integration/stubba_integration_test.rb} +1 -1
- data/test/{stubba_test_result_integration_test.rb → integration/stubba_test_result_integration_test.rb} +1 -1
- data/test/test_helper.rb +8 -0
- data/test/test_runner.rb +31 -0
- data/test/{mocha → unit}/any_instance_method_test.rb +0 -0
- data/test/unit/array_inspect_test.rb +16 -0
- data/test/{mocha → unit}/auto_verify_test.rb +0 -0
- data/test/{mocha → unit}/central_test.rb +0 -0
- data/test/{mocha → unit}/class_method_test.rb +0 -0
- data/test/unit/date_time_inspect_test.rb +21 -0
- data/test/unit/expectation_raiser_test.rb +28 -0
- data/test/{mocha → unit}/expectation_test.rb +105 -63
- data/test/unit/hash_inspect_test.rb +16 -0
- data/test/{mocha → unit}/infinite_range_test.rb +8 -5
- data/test/{mocha → unit}/metaclass_test.rb +0 -0
- data/test/unit/missing_expectation_test.rb +51 -0
- data/test/unit/mock_test.rb +351 -0
- data/test/unit/multiple_yields_test.rb +18 -0
- data/test/unit/no_yield_test.rb +18 -0
- data/test/unit/object_inspect_test.rb +35 -0
- data/test/{mocha → unit}/object_test.rb +0 -0
- data/test/unit/parameter_matchers/all_of_test.rb +26 -0
- data/test/unit/parameter_matchers/any_of_test.rb +26 -0
- data/test/unit/parameter_matchers/anything_test.rb +21 -0
- data/test/unit/parameter_matchers/has_entry_test.rb +25 -0
- data/test/unit/parameter_matchers/has_key_test.rb +25 -0
- data/test/unit/parameter_matchers/has_value_test.rb +25 -0
- data/test/unit/parameter_matchers/includes_test.rb +25 -0
- data/test/unit/parameter_matchers/stub_matcher.rb +22 -0
- data/test/{mocha → unit}/pretty_parameters_test.rb +0 -0
- data/test/unit/return_values_test.rb +63 -0
- data/test/{mocha → unit}/setup_and_teardown_test.rb +0 -0
- data/test/unit/single_return_value_test.rb +33 -0
- data/test/unit/single_yield_test.rb +18 -0
- data/test/unit/string_inspect_test.rb +11 -0
- data/test/unit/stub_test.rb +24 -0
- data/test/unit/yield_parameters_test.rb +93 -0
- metadata +117 -73
- data/lib/mocha/mock_methods.rb +0 -122
- data/test/all_tests.rb +0 -75
- data/test/mocha/inspect_test.rb +0 -90
- data/test/mocha/mock_methods_test.rb +0 -235
- data/test/mocha/mock_test.rb +0 -84
@@ -0,0 +1,30 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
module ParameterMatchers
|
4
|
+
|
5
|
+
# :call-seq: anything -> parameter_matcher
|
6
|
+
#
|
7
|
+
# Matches any object.
|
8
|
+
# object = mock()
|
9
|
+
# object.expects(:method_1).with(anything)
|
10
|
+
# object.method_1('foo')
|
11
|
+
# # no error raised
|
12
|
+
def anything
|
13
|
+
Anything.new
|
14
|
+
end
|
15
|
+
|
16
|
+
class Anything # :nodoc:
|
17
|
+
|
18
|
+
def ==(parameter)
|
19
|
+
return true
|
20
|
+
end
|
21
|
+
|
22
|
+
def mocha_inspect
|
23
|
+
"anything"
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
module ParameterMatchers
|
4
|
+
|
5
|
+
# :call-seq: has_entry(key, value) -> parameter_matcher
|
6
|
+
#
|
7
|
+
# Matches +Hash+ containing entry with +key+ and +value+.
|
8
|
+
# object = mock()
|
9
|
+
# object.expects(:method_1).with(has_entry('key_1', 1))
|
10
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
11
|
+
# # no error raised
|
12
|
+
#
|
13
|
+
# object = mock()
|
14
|
+
# object.expects(:method_1).with(has_entry('key_1', 1))
|
15
|
+
# object.method_1('key_1' => 2, 'key_2' => 1)
|
16
|
+
# # error raised, because method_1 was not called with Hash containing entry: 'key_1' => 1
|
17
|
+
def has_entry(key, value)
|
18
|
+
HasEntry.new(key, value)
|
19
|
+
end
|
20
|
+
|
21
|
+
class HasEntry # :nodoc:
|
22
|
+
|
23
|
+
def initialize(key, value)
|
24
|
+
@key, @value = key, value
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(parameter)
|
28
|
+
parameter[@key] == @value
|
29
|
+
end
|
30
|
+
|
31
|
+
def mocha_inspect
|
32
|
+
"has_entry(#{@key.mocha_inspect}, #{@value.mocha_inspect})"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
module ParameterMatchers
|
4
|
+
|
5
|
+
# :call-seq: has_key(key) -> parameter_matcher
|
6
|
+
#
|
7
|
+
# Matches +Hash+ containing +key+.
|
8
|
+
# object = mock()
|
9
|
+
# object.expects(:method_1).with(has_key('key_1'))
|
10
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
11
|
+
# # no error raised
|
12
|
+
#
|
13
|
+
# object = mock()
|
14
|
+
# object.expects(:method_1).with(has_key('key_1'))
|
15
|
+
# object.method_1('key_2' => 2)
|
16
|
+
# # error raised, because method_1 was not called with Hash containing key: 'key_1'
|
17
|
+
def has_key(key)
|
18
|
+
HasKey.new(key)
|
19
|
+
end
|
20
|
+
|
21
|
+
class HasKey # :nodoc:
|
22
|
+
|
23
|
+
def initialize(key)
|
24
|
+
@key = key
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(parameter)
|
28
|
+
parameter.keys.include?(@key)
|
29
|
+
end
|
30
|
+
|
31
|
+
def mocha_inspect
|
32
|
+
"has_key(#{@key.mocha_inspect})"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
module ParameterMatchers
|
4
|
+
|
5
|
+
# :call-seq: has_value(value) -> parameter_matcher
|
6
|
+
#
|
7
|
+
# Matches +Hash+ containing +value+.
|
8
|
+
# object = mock()
|
9
|
+
# object.expects(:method_1).with(has_value(1))
|
10
|
+
# object.method_1('key_1' => 1, 'key_2' => 2)
|
11
|
+
# # no error raised
|
12
|
+
#
|
13
|
+
# object = mock()
|
14
|
+
# object.expects(:method_1).with(has_value(1))
|
15
|
+
# object.method_1('key_2' => 2)
|
16
|
+
# # error raised, because method_1 was not called with Hash containing value: 1
|
17
|
+
def has_value(value)
|
18
|
+
HasValue.new(value)
|
19
|
+
end
|
20
|
+
|
21
|
+
class HasValue # :nodoc:
|
22
|
+
|
23
|
+
def initialize(value)
|
24
|
+
@value = value
|
25
|
+
end
|
26
|
+
|
27
|
+
def ==(parameter)
|
28
|
+
parameter.values.include?(@value)
|
29
|
+
end
|
30
|
+
|
31
|
+
def mocha_inspect
|
32
|
+
"has_value(#{@value.mocha_inspect})"
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Mocha
|
2
|
+
|
3
|
+
module ParameterMatchers
|
4
|
+
|
5
|
+
# :call-seq: includes(item) -> parameter_matcher
|
6
|
+
#
|
7
|
+
# Matches any object that responds true to include?(item)
|
8
|
+
# object = mock()
|
9
|
+
# object.expects(:method_1).with(includes('foo'))
|
10
|
+
# object.method_1(['foo', 'bar'])
|
11
|
+
# # no error raised
|
12
|
+
#
|
13
|
+
# object.method_1(['baz'])
|
14
|
+
# # error raised, because ['baz'] does not include 'foo'.
|
15
|
+
def includes(item)
|
16
|
+
Includes.new(item)
|
17
|
+
end
|
18
|
+
|
19
|
+
class Includes # :nodoc:
|
20
|
+
|
21
|
+
def initialize(item)
|
22
|
+
@item = item
|
23
|
+
end
|
24
|
+
|
25
|
+
def ==(parameter)
|
26
|
+
return parameter.include?(@item)
|
27
|
+
end
|
28
|
+
|
29
|
+
def mocha_inspect
|
30
|
+
"includes(#{@item.mocha_inspect})"
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'mocha/single_return_value'
|
2
|
+
|
3
|
+
module Mocha # :nodoc:
|
4
|
+
|
5
|
+
class ReturnValues # :nodoc:
|
6
|
+
|
7
|
+
def self.build(*values)
|
8
|
+
new(*values.map { |value| SingleReturnValue.new(value) })
|
9
|
+
end
|
10
|
+
|
11
|
+
attr_accessor :values
|
12
|
+
|
13
|
+
def initialize(*values)
|
14
|
+
@values = values
|
15
|
+
end
|
16
|
+
|
17
|
+
def next
|
18
|
+
case @values.size
|
19
|
+
when 0: nil
|
20
|
+
when 1: @values.first.evaluate
|
21
|
+
else @values.shift.evaluate
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def +(other)
|
26
|
+
self.class.new(*(@values + other.values))
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'mocha/is_a'
|
2
|
+
require 'mocha/deprecation'
|
3
|
+
|
4
|
+
module Mocha # :nodoc:
|
5
|
+
|
6
|
+
class SingleReturnValue # :nodoc:
|
7
|
+
|
8
|
+
def initialize(value)
|
9
|
+
@value = value
|
10
|
+
end
|
11
|
+
|
12
|
+
def evaluate
|
13
|
+
if @value.__is_a__(Proc) then
|
14
|
+
message = 'use of Expectation#returns with instance of Proc - see Expectation#returns RDoc for alternatives'
|
15
|
+
Deprecation.warning(message)
|
16
|
+
@value.call
|
17
|
+
else
|
18
|
+
@value
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
data/lib/mocha/standalone.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'mocha/auto_verify'
|
2
|
+
require 'mocha/parameter_matchers'
|
2
3
|
require 'mocha/setup_and_teardown'
|
3
4
|
|
4
5
|
module Mocha
|
@@ -6,6 +7,7 @@ module Mocha
|
|
6
7
|
module Standalone
|
7
8
|
|
8
9
|
include AutoVerify
|
10
|
+
include ParameterMatchers
|
9
11
|
include SetupAndTeardown
|
10
12
|
|
11
13
|
def mocha_setup
|
data/lib/mocha/stub.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'mocha/expectation'
|
2
|
+
|
3
|
+
module Mocha # :nodoc:
|
4
|
+
|
5
|
+
class Stub < Expectation # :nodoc:
|
6
|
+
|
7
|
+
def initialize(mock, method_name, backtrace = nil)
|
8
|
+
super
|
9
|
+
@expected_count = Range.at_least(0)
|
10
|
+
end
|
11
|
+
|
12
|
+
def verify
|
13
|
+
true
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'mocha/no_yields'
|
2
|
+
require 'mocha/single_yield'
|
3
|
+
require 'mocha/multiple_yields'
|
4
|
+
|
5
|
+
module Mocha # :nodoc:
|
6
|
+
|
7
|
+
class YieldParameters # :nodoc:
|
8
|
+
|
9
|
+
def initialize
|
10
|
+
@parameter_groups = []
|
11
|
+
end
|
12
|
+
|
13
|
+
def next_invocation
|
14
|
+
case @parameter_groups.size
|
15
|
+
when 0: NoYields.new
|
16
|
+
when 1: @parameter_groups.first
|
17
|
+
else @parameter_groups.shift
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def add(*parameters)
|
22
|
+
@parameter_groups << SingleYield.new(*parameters)
|
23
|
+
end
|
24
|
+
|
25
|
+
def multiple_add(*parameter_groups)
|
26
|
+
@parameter_groups << MultipleYields.new(*parameter_groups)
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "test_helper")
|
2
|
+
require 'mocha'
|
3
|
+
require 'test_runner'
|
4
|
+
|
5
|
+
class MockedMethodDispatchAcceptanceTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include TestRunner
|
8
|
+
|
9
|
+
def test_should_find_latest_matching_expectation
|
10
|
+
test_result = run_test do
|
11
|
+
mock = mock()
|
12
|
+
mock.stubs(:method).returns(1)
|
13
|
+
mock.stubs(:method).returns(2)
|
14
|
+
assert_equal 2, mock.method
|
15
|
+
assert_equal 2, mock.method
|
16
|
+
assert_equal 2, mock.method
|
17
|
+
end
|
18
|
+
assert_passed(test_result)
|
19
|
+
end
|
20
|
+
|
21
|
+
def test_should_find_latest_expectation_which_has_not_stopped_matching
|
22
|
+
test_result = run_test do
|
23
|
+
mock = mock()
|
24
|
+
mock.stubs(:method).returns(1)
|
25
|
+
mock.stubs(:method).once.returns(2)
|
26
|
+
assert_equal 2, mock.method
|
27
|
+
assert_equal 1, mock.method
|
28
|
+
assert_equal 1, mock.method
|
29
|
+
end
|
30
|
+
assert_passed(test_result)
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_should_keep_finding_later_stub_and_so_never_satisfy_earlier_expectation
|
34
|
+
test_result = run_test do
|
35
|
+
mock = mock()
|
36
|
+
mock.expects(:method).returns(1)
|
37
|
+
mock.stubs(:method).returns(2)
|
38
|
+
assert_equal 2, mock.method
|
39
|
+
assert_equal 2, mock.method
|
40
|
+
assert_equal 2, mock.method
|
41
|
+
end
|
42
|
+
assert_failed(test_result)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_should_find_later_expectation_until_it_stops_matching_then_find_earlier_stub
|
46
|
+
test_result = run_test do
|
47
|
+
mock = mock()
|
48
|
+
mock.stubs(:method).returns(1)
|
49
|
+
mock.expects(:method).returns(2)
|
50
|
+
assert_equal 2, mock.method
|
51
|
+
assert_equal 1, mock.method
|
52
|
+
assert_equal 1, mock.method
|
53
|
+
end
|
54
|
+
assert_passed(test_result)
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_should
|
58
|
+
# flunk
|
59
|
+
test_result = run_test do
|
60
|
+
mock = mock()
|
61
|
+
mock.stubs(:method).returns(1)
|
62
|
+
mock.stubs(:method).times(2..3).returns(2)
|
63
|
+
assert_equal 2, mock.method
|
64
|
+
assert_equal 2, mock.method
|
65
|
+
assert_equal 2, mock.method
|
66
|
+
assert_equal 1, mock.method
|
67
|
+
assert_equal 1, mock.method
|
68
|
+
end
|
69
|
+
assert_passed(test_result)
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), "..", "test_helper")
|
2
|
+
require 'mocha'
|
3
|
+
require 'test_runner'
|
4
|
+
|
5
|
+
class ParameterMatcherAcceptanceTest < Test::Unit::TestCase
|
6
|
+
|
7
|
+
include TestRunner
|
8
|
+
|
9
|
+
def test_should_match_hash_parameter_with_specified_key
|
10
|
+
test_result = run_test do
|
11
|
+
mock = mock()
|
12
|
+
mock.expects(:method).with(has_key(:key_1))
|
13
|
+
mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
|
14
|
+
end
|
15
|
+
assert_passed(test_result)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_should_not_match_hash_parameter_with_specified_key
|
19
|
+
test_result = run_test do
|
20
|
+
mock = mock()
|
21
|
+
mock.expects(:method).with(has_key(:key_1))
|
22
|
+
mock.method(:key_2 => 'value_2')
|
23
|
+
end
|
24
|
+
assert_failed(test_result)
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_should_match_hash_parameter_with_specified_value
|
28
|
+
test_result = run_test do
|
29
|
+
mock = mock()
|
30
|
+
mock.expects(:method).with(has_value('value_1'))
|
31
|
+
mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
|
32
|
+
end
|
33
|
+
assert_passed(test_result)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_should_not_match_hash_parameter_with_specified_value
|
37
|
+
test_result = run_test do
|
38
|
+
mock = mock()
|
39
|
+
mock.expects(:method).with(has_value('value_1'))
|
40
|
+
mock.method(:key_2 => 'value_2')
|
41
|
+
end
|
42
|
+
assert_failed(test_result)
|
43
|
+
end
|
44
|
+
|
45
|
+
def test_should_match_hash_parameter_with_specified_entry
|
46
|
+
test_result = run_test do
|
47
|
+
mock = mock()
|
48
|
+
mock.expects(:method).with(has_entry(:key_1, 'value_1'))
|
49
|
+
mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
|
50
|
+
end
|
51
|
+
assert_passed(test_result)
|
52
|
+
end
|
53
|
+
|
54
|
+
def test_should_not_match_hash_parameter_with_specified_entry
|
55
|
+
test_result = run_test do
|
56
|
+
mock = mock()
|
57
|
+
mock.expects(:method).with(has_entry(:key_1, 'value_2'))
|
58
|
+
mock.method(:key_1 => 'value_1', :key_2 => 'value_2')
|
59
|
+
end
|
60
|
+
assert_failed(test_result)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|