1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
|
require 'test_runner'
require 'execution_point'
# rubocop:disable Metrics/ModuleLength
module SharedTests
include TestRunner
def test_assertion_satisfied
test_result = run_as_test do
assert true
end
assert_passed(test_result)
end
def test_assertion_unsatisfied
execution_point = nil
test_result = run_as_test do
execution_point = ExecutionPoint.current; flunk
end
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
end
def test_mock_object_unexpected_invocation
execution_point = nil
test_result = run_as_test do
mock = mock('not expecting invocation')
execution_point = ExecutionPoint.current; mock.unexpected
end
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal ['unexpected invocation: #<Mock:not expecting invocation>.unexpected()'], test_result.failure_message_lines
end
def test_mock_object_explicitly_unexpected_invocation
execution_point = nil
test_result = run_as_test do
mock = mock('not expecting invocation')
mock.expects(:unexpected).never
execution_point = ExecutionPoint.current; mock.unexpected
end
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal [
'unexpected invocation: #<Mock:not expecting invocation>.unexpected()',
'unsatisfied expectations:',
'- expected never, invoked once: #<Mock:not expecting invocation>.unexpected(any_parameters)'
], test_result.failure_message_lines
end
def test_mock_object_unsatisfied_expectation
execution_point = nil
test_result = run_as_test do
mock = mock('expecting invocation')
execution_point = ExecutionPoint.current; mock.expects(:expected)
end
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal [
'not all expectations were satisfied',
'unsatisfied expectations:',
'- expected exactly once, invoked never: #<Mock:expecting invocation>.expected(any_parameters)'
], test_result.failure_message_lines
end
def test_mock_object_unexpected_invocation_in_setup
execution_point = nil
test_result = run_as_tests(
setup: lambda {
mock = mock('not expecting invocation')
execution_point = ExecutionPoint.current; mock.unexpected
},
test_me: lambda {
assert true
}
)
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal ['unexpected invocation: #<Mock:not expecting invocation>.unexpected()'], test_result.failure_message_lines
end
def test_mock_object_unsatisfied_expectation_in_setup
execution_point = nil
test_result = run_as_tests(
setup: lambda {
mock = mock('expecting invocation')
execution_point = ExecutionPoint.current; mock.expects(:expected)
},
test_me: lambda {
assert true
}
)
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal [
'not all expectations were satisfied',
'unsatisfied expectations:',
'- expected exactly once, invoked never: #<Mock:expecting invocation>.expected(any_parameters)'
], test_result.failure_message_lines
end
def test_mock_object_unexpected_invocation_in_teardown
execution_point = nil
test_result = run_as_tests(
test_me: lambda {
assert true
},
teardown: lambda {
mock = mock('not expecting invocation')
execution_point = ExecutionPoint.current; mock.unexpected
}
)
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal ['unexpected invocation: #<Mock:not expecting invocation>.unexpected()'], test_result.failure_message_lines
end
def test_real_object_explicitly_unexpected_invocation
execution_point = nil
object = Object.new
test_result = run_as_test do
object.expects(:unexpected).never
execution_point = ExecutionPoint.current; object.unexpected
end
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal [
"unexpected invocation: #{object.mocha_inspect}.unexpected()",
'unsatisfied expectations:',
"- expected never, invoked once: #{object.mocha_inspect}.unexpected(any_parameters)"
], test_result.failure_message_lines
end
def test_real_object_unsatisfied_expectation
execution_point = nil
object = Object.new
test_result = run_as_test do
execution_point = ExecutionPoint.current; object.expects(:expected)
end
assert_failed(test_result)
failure = test_result.failures.first
assert_equal execution_point, ExecutionPoint.new(failure.location)
assert_equal [
'not all expectations were satisfied',
'unsatisfied expectations:',
"- expected exactly once, invoked never: #{object.mocha_inspect}.expected(any_parameters)"
], test_result.failure_message_lines
end
def test_real_object_expectation_does_not_leak_into_subsequent_test
execution_point = nil
klass = Class.new
test_result = run_as_tests(
test_1: lambda {
klass.expects(:foo)
klass.foo
},
test_2: lambda {
execution_point = ExecutionPoint.current; klass.foo
}
)
assert_errored(test_result)
exception = test_result.errors.first.exception
assert_equal execution_point, ExecutionPoint.new(exception.backtrace)
assert_match(/undefined method `foo'/, exception.message)
end
def test_leaky_mock
origin = nil
leaky_mock = nil
execution_point = nil
test_result = run_as_tests(
test_1: lambda {
origin = mocha_test_name
leaky_mock ||= begin
bad_mock = mock(:leaky)
bad_mock.expects(:call)
bad_mock
end
leaky_mock.call
},
test_2: lambda {
leaky_mock ||= begin
bad_mock = mock(:leaky)
bad_mock.expects(:call)
bad_mock
end
execution_point = ExecutionPoint.current; leaky_mock.call
}
)
assert_errored(test_result)
exception = test_result.errors.first.exception
assert_equal execution_point, ExecutionPoint.new(exception.backtrace)
expected = /#<Mock:leaky> was instantiated in #{Regexp.escape(origin)} but it is receiving invocations within another test/
assert_match(expected, exception.message)
end
end
# rubocop:enable Metrics/ModuleLength
|