flexmock 1.3.2 → 1.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile.lock +9 -9
- data/Rakefile +3 -1
- data/lib/flexmock.rb +1 -1
- data/lib/flexmock/argument_matchers.rb +1 -1
- data/lib/flexmock/argument_types.rb +1 -2
- data/lib/flexmock/base.rb +2 -1
- data/lib/flexmock/call_record.rb +30 -0
- data/lib/flexmock/call_validator.rb +68 -0
- data/lib/flexmock/composite_expectation.rb +56 -0
- data/lib/flexmock/core.rb +30 -64
- data/lib/flexmock/core_class_methods.rb +1 -1
- data/lib/flexmock/default_framework_adapter.rb +1 -1
- data/lib/flexmock/deprecated_methods.rb +8 -3
- data/lib/flexmock/errors.rb +1 -1
- data/lib/flexmock/expectation.rb +7 -84
- data/lib/flexmock/expectation_builder.rb +133 -0
- data/lib/flexmock/expectation_director.rb +6 -4
- data/lib/flexmock/expectation_recorder.rb +42 -0
- data/lib/flexmock/extensions/active_record_model.rb +109 -0
- data/lib/flexmock/mock_builder.rb +139 -0
- data/lib/flexmock/mock_container.rb +13 -214
- data/lib/flexmock/noop.rb +1 -1
- data/lib/flexmock/ordering.rb +1 -2
- data/lib/flexmock/partial_mock.rb +95 -57
- data/lib/flexmock/rails.rb +1 -1
- data/lib/flexmock/recorder.rb +4 -3
- data/lib/flexmock/rspec.rb +1 -1
- data/lib/flexmock/rspec_spy_matcher.rb +4 -0
- data/lib/flexmock/spy_describers.rb +22 -5
- data/lib/flexmock/test_unit.rb +2 -40
- data/lib/flexmock/test_unit_integration.rb +4 -4
- data/lib/flexmock/test_unit_testcase_extensions.rb +49 -0
- data/lib/flexmock/undefined.rb +1 -1
- data/lib/flexmock/validators.rb +18 -12
- data/lib/flexmock/version.rb +1 -1
- data/test/based_partials_test.rb +1 -1
- data/test/container_methods_test.rb +1 -1
- data/test/default_framework_adapter_test.rb +1 -1
- data/test/demeter_mocking_test.rb +52 -2
- data/test/deprecated_methods_test.rb +1 -1
- data/test/examples_from_readme_test.rb +1 -1
- data/test/expectation_description_test.rb +1 -1
- data/test/extended_should_receive_test.rb +1 -1
- data/test/mock_builder_test.rb +68 -0
- data/test/naming_test.rb +1 -1
- data/test/new_instances_test.rb +1 -1
- data/test/partial_mock_test.rb +23 -6
- data/test/record_mode_test.rb +1 -1
- data/test/rspec_integration/integration_spec.rb +1 -1
- data/test/samples_test.rb +1 -2
- data/test/should_ignore_missing_test.rb +1 -1
- data/test/should_receive_test.rb +1 -1
- data/test/test_setup.rb +17 -0
- data/test/test_unit_integration/auto_test_unit_test.rb +1 -1
- data/test/tu_integration_test.rb +1 -1
- data/test/undefined_test.rb +1 -1
- metadata +52 -52
- data/TAGS +0 -1056
- data/lib/flexmock/composite.rb +0 -10
- data/lib/flexmock/rails/view_mocking.rb +0 -144
- data/test/rails_view_stub_test.rb +0 -145
data/lib/flexmock/rails.rb
CHANGED
data/lib/flexmock/recorder.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -13,7 +13,6 @@ require 'flexmock/argument_types'
|
|
13
13
|
|
14
14
|
class FlexMock
|
15
15
|
|
16
|
-
####################################################################
|
17
16
|
# Translate arbitrary method calls into expectations on the given
|
18
17
|
# mock object.
|
19
18
|
#
|
@@ -58,7 +57,9 @@ class FlexMock
|
|
58
57
|
# given arguments.
|
59
58
|
def method_missing(sym, *args, &block)
|
60
59
|
location = caller.first
|
61
|
-
expectation = @mock.
|
60
|
+
expectation = @mock.
|
61
|
+
flexmock_define_expectation(location, sym).
|
62
|
+
and_return(&block)
|
62
63
|
if strict?
|
63
64
|
args = args.collect { |arg| eq(arg) }
|
64
65
|
expectation.with(*args).ordered.once
|
data/lib/flexmock/rspec.rb
CHANGED
@@ -1,6 +1,14 @@
|
|
1
1
|
class FlexMock
|
2
2
|
|
3
3
|
module SpyDescribers
|
4
|
+
def spy_description(spy, sym, args, options)
|
5
|
+
result = "have received "
|
6
|
+
result << call_description(sym, args)
|
7
|
+
result << times_description(options[:times])
|
8
|
+
result << block_description(options[:with_block])
|
9
|
+
result
|
10
|
+
end
|
11
|
+
|
4
12
|
def describe_spy_expectation(spy, sym, args, options={})
|
5
13
|
describe_spy(spy, sym, args, options)
|
6
14
|
end
|
@@ -14,8 +22,7 @@ class FlexMock
|
|
14
22
|
def describe_spy(spy, sym, args, options, not_clause="")
|
15
23
|
result = "expected "
|
16
24
|
result << call_description(sym, args)
|
17
|
-
result << " to#{not_clause} be received by "
|
18
|
-
result << spy.inspect
|
25
|
+
result << " to#{not_clause} be received by " << spy.inspect
|
19
26
|
result << times_description(options[:times])
|
20
27
|
result << block_description(options[:with_block])
|
21
28
|
result << ".\n"
|
@@ -30,14 +37,24 @@ class FlexMock
|
|
30
37
|
else
|
31
38
|
result << "The following messages have been received:\n"
|
32
39
|
spy.flexmock_calls.each do |call_record|
|
33
|
-
result
|
34
|
-
result << " matched by " << call_record.expectation.description if call_record.expectation
|
35
|
-
result << "\n"
|
40
|
+
append_call_record(result, call_record)
|
36
41
|
end
|
37
42
|
end
|
38
43
|
result
|
39
44
|
end
|
40
45
|
|
46
|
+
def append_call_record(result, call_record)
|
47
|
+
result <<
|
48
|
+
" " <<
|
49
|
+
call_description(call_record.method_name, call_record.args)
|
50
|
+
if call_record.expectation
|
51
|
+
result <<
|
52
|
+
" matched by " <<
|
53
|
+
call_record.expectation.description
|
54
|
+
end
|
55
|
+
result << "\n"
|
56
|
+
end
|
57
|
+
|
41
58
|
def times_description(times)
|
42
59
|
case times
|
43
60
|
when 0
|
data/lib/flexmock/test_unit.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -10,42 +10,4 @@
|
|
10
10
|
#+++
|
11
11
|
|
12
12
|
require 'flexmock/test_unit_integration'
|
13
|
-
|
14
|
-
class FlexMock
|
15
|
-
module GenericTestCase
|
16
|
-
def self.define_extensions_on(klass)
|
17
|
-
klass.class_eval do
|
18
|
-
include FlexMock::ArgumentTypes
|
19
|
-
include FlexMock::MockContainer
|
20
|
-
|
21
|
-
# Alias the original teardown behavior for later use.
|
22
|
-
alias :flexmock_original_teardown :teardown
|
23
|
-
|
24
|
-
# Teardown the test case, verifying any mocks that might have been
|
25
|
-
# defined in this test case.
|
26
|
-
def teardown
|
27
|
-
flexmock_teardown
|
28
|
-
flexmock_original_teardown
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
if defined?(MiniTest)
|
36
|
-
module MiniTest
|
37
|
-
class Unit
|
38
|
-
class TestCase
|
39
|
-
FlexMock::GenericTestCase.define_extensions_on(self)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
43
|
-
else
|
44
|
-
module Test
|
45
|
-
module Unit
|
46
|
-
class TestCase
|
47
|
-
FlexMock::GenericTestCase.define_extensions_on(self)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
13
|
+
require 'flexmock/test_unit_testcase_extensions'
|
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -15,7 +15,6 @@ require 'flexmock/test_unit_assert_spy_called'
|
|
15
15
|
|
16
16
|
class FlexMock
|
17
17
|
|
18
|
-
####################################################################
|
19
18
|
# Test::Unit::TestCase Integration.
|
20
19
|
#
|
21
20
|
# Include this module in any TestCase class in a Test::Unit test
|
@@ -41,7 +40,6 @@ class FlexMock
|
|
41
40
|
|
42
41
|
end
|
43
42
|
|
44
|
-
####################################################################
|
45
43
|
# Adapter for adapting FlexMock to the Test::Unit framework.
|
46
44
|
#
|
47
45
|
class TestUnitFrameworkAdapter
|
@@ -58,7 +56,9 @@ class FlexMock
|
|
58
56
|
end
|
59
57
|
|
60
58
|
def assertion_failed_error
|
61
|
-
defined?(Test::Unit::AssertionFailedError) ?
|
59
|
+
defined?(Test::Unit::AssertionFailedError) ?
|
60
|
+
Test::Unit::AssertionFailedError :
|
61
|
+
MiniTest::Assertion
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -0,0 +1,49 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#---
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
|
+
# All rights reserved.
|
6
|
+
|
7
|
+
# Permission is granted for use, copying, modification, distribution,
|
8
|
+
# and distribution of modified versions of this work as long as the
|
9
|
+
# above copyright notice is included.
|
10
|
+
#+++
|
11
|
+
|
12
|
+
class FlexMock
|
13
|
+
module GenericTestCase
|
14
|
+
def self.define_extensions_on(klass)
|
15
|
+
klass.class_eval do
|
16
|
+
include FlexMock::ArgumentTypes
|
17
|
+
include FlexMock::MockContainer
|
18
|
+
|
19
|
+
# Alias the original teardown behavior for later use.
|
20
|
+
alias :flexmock_original_teardown :teardown
|
21
|
+
|
22
|
+
# Teardown the test case, verifying any mocks that might have been
|
23
|
+
# defined in this test case.
|
24
|
+
def teardown
|
25
|
+
flexmock_teardown
|
26
|
+
flexmock_original_teardown
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
if defined?(MiniTest)
|
34
|
+
module MiniTest
|
35
|
+
class Unit
|
36
|
+
class TestCase
|
37
|
+
FlexMock::GenericTestCase.define_extensions_on(self)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
else
|
42
|
+
module Test
|
43
|
+
module Unit
|
44
|
+
class TestCase
|
45
|
+
FlexMock::GenericTestCase.define_extensions_on(self)
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/flexmock/undefined.rb
CHANGED
data/lib/flexmock/validators.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
#---
|
4
|
-
# Copyright 2003-
|
4
|
+
# Copyright 2003-2013 by Jim Weirich (jim.weirich@gmail.com).
|
5
5
|
# All rights reserved.
|
6
6
|
|
7
7
|
# Permission is granted for use, copying, modification, distribution,
|
@@ -32,11 +32,6 @@ class FlexMock
|
|
32
32
|
n < @limit
|
33
33
|
end
|
34
34
|
|
35
|
-
# Pluralize "call"
|
36
|
-
def calls(n)
|
37
|
-
n == 1 ? "call" : "calls"
|
38
|
-
end
|
39
|
-
|
40
35
|
# Human readable description of the validator
|
41
36
|
def describe
|
42
37
|
case @limit
|
@@ -58,14 +53,25 @@ class FlexMock
|
|
58
53
|
def validate_count(n, &block)
|
59
54
|
@exp.flexmock_location_filter do
|
60
55
|
FlexMock.framework_adapter.make_assertion(
|
61
|
-
lambda {
|
62
|
-
|
63
|
-
"#{describe_limit} matching #{calls(@limit)} expected\n" +
|
64
|
-
"#{n} matching #{calls(n)} found\n" +
|
65
|
-
describe_calls(@exp.mock)
|
66
|
-
}, &block)
|
56
|
+
lambda { construct_validation_count_error_message(n) },
|
57
|
+
&block)
|
67
58
|
end
|
68
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
# Build the error message for an invalid count
|
64
|
+
def construct_validation_count_error_message(n)
|
65
|
+
"Method '#{@exp}' called incorrect number of times\n" +
|
66
|
+
"#{describe_limit} matching #{calls(@limit)} expected\n" +
|
67
|
+
"#{n} matching #{calls(n)} found\n" +
|
68
|
+
describe_calls(@exp.mock)
|
69
|
+
end
|
70
|
+
|
71
|
+
# Pluralize "call"
|
72
|
+
def calls(n)
|
73
|
+
n == 1 ? "call" : "calls"
|
74
|
+
end
|
69
75
|
end
|
70
76
|
|
71
77
|
####################################################################
|
data/lib/flexmock/version.rb
CHANGED
data/test/based_partials_test.rb
CHANGED
@@ -5,7 +5,7 @@ require 'test/test_setup'
|
|
5
5
|
class TestDemeterMocking < Test::Unit::TestCase
|
6
6
|
include FlexMock::TestCase
|
7
7
|
|
8
|
-
def
|
8
|
+
def test_demeter_mocking_basics
|
9
9
|
m = flexmock("A")
|
10
10
|
m.should_receive("children.first").and_return(:first)
|
11
11
|
assert_kind_of FlexMock, m
|
@@ -36,12 +36,24 @@ class TestDemeterMocking < Test::Unit::TestCase
|
|
36
36
|
assert_equal :last, m.child.x.y.z.last
|
37
37
|
end
|
38
38
|
|
39
|
-
def
|
39
|
+
def test_multi_level_deep_demeter_violation_with_mock
|
40
40
|
a = flexmock("a")
|
41
41
|
a.should_receive("b.c.d.e.f.g.h.i.j.k").and_return(:xyzzy)
|
42
42
|
assert_equal :xyzzy, a.b.c.d.e.f.g.h.i.j.k
|
43
43
|
end
|
44
44
|
|
45
|
+
def test_partial_with_demeter
|
46
|
+
a = flexmock(Object.new, "a partial")
|
47
|
+
a.should_receive("b.c").and_return(:xyzzy)
|
48
|
+
assert_equal :xyzzy, a.b.c
|
49
|
+
end
|
50
|
+
|
51
|
+
def test_multi_level_deep_demeter_violation_with_partial
|
52
|
+
a = flexmock(Object.new, "a")
|
53
|
+
a.should_receive("b.c.d.e.f.g.h.i.j.k").and_return(:xyzzy)
|
54
|
+
assert_equal :xyzzy, a.b.c.d.e.f.g.h.i.j.k
|
55
|
+
end
|
56
|
+
|
45
57
|
def test_final_method_can_have_multiple_expecations
|
46
58
|
a = flexmock("a")
|
47
59
|
a.should_receive("b.c.d.last").with(1).and_return(:one).once
|
@@ -62,6 +74,44 @@ class TestDemeterMocking < Test::Unit::TestCase
|
|
62
74
|
assert_match(/child/i, ex.message)
|
63
75
|
end
|
64
76
|
|
77
|
+
def test_compatible_mock_declarations_are_ok_full_mock_version
|
78
|
+
m = flexmock("A")
|
79
|
+
b = flexmock("B")
|
80
|
+
c = flexmock("C")
|
81
|
+
m.should_receive(:b => b)
|
82
|
+
b.should_receive(:c => c)
|
83
|
+
c.should_receive(:foo => :bar)
|
84
|
+
m.should_receive("b.c.baz").and_return(:barg)
|
85
|
+
m.should_receive("b.zhar").and_return(:zzz)
|
86
|
+
|
87
|
+
assert_equal :bar, m.b.c.foo
|
88
|
+
assert_equal :barg, m.b.c.baz
|
89
|
+
assert_equal :zzz, m.b.zhar
|
90
|
+
end
|
91
|
+
|
92
|
+
def test_compatible_mock_declarations_are_ok_partial_mock_version
|
93
|
+
m = flexmock("A")
|
94
|
+
b = flexmock(Object.new, "B")
|
95
|
+
c = flexmock("C")
|
96
|
+
m.should_receive(:b => b)
|
97
|
+
b.should_receive(:c => c)
|
98
|
+
c.should_receive(:foo => :bar)
|
99
|
+
m.should_receive("b.c.baz").and_return(:barg)
|
100
|
+
m.should_receive("b.zhar").and_return(:zzz)
|
101
|
+
|
102
|
+
assert_equal :bar, m.b.c.foo
|
103
|
+
assert_equal :barg, m.b.c.baz
|
104
|
+
assert_equal :zzz, m.b.zhar
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_paths
|
108
|
+
m = flexmock("A")
|
109
|
+
b = flexmock("B")
|
110
|
+
m.should_receive("a.b" => b)
|
111
|
+
m.should_receive("a.b.c.x" => 1)
|
112
|
+
m.should_receive("a.b.c.y" => 2)
|
113
|
+
end
|
114
|
+
|
65
115
|
def test_conflicting_mock_declarations_in_reverse_order_does_not_raise_error
|
66
116
|
# Not all conflicting definitions can be detected.
|
67
117
|
m = flexmock("A")
|