OLD | NEW |
(Empty) | |
| 1 #!/usr/bin/python2.4 |
| 2 # |
| 3 # Unit tests for Mox. |
| 4 # |
| 5 # Copyright 2008 Google Inc. |
| 6 # |
| 7 # Licensed under the Apache License, Version 2.0 (the "License"); |
| 8 # you may not use this file except in compliance with the License. |
| 9 # You may obtain a copy of the License at |
| 10 # |
| 11 # http://www.apache.org/licenses/LICENSE-2.0 |
| 12 # |
| 13 # Unless required by applicable law or agreed to in writing, software |
| 14 # distributed under the License is distributed on an "AS IS" BASIS, |
| 15 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 16 # See the License for the specific language governing permissions and |
| 17 # limitations under the License. |
| 18 |
| 19 import cStringIO |
| 20 import unittest |
| 21 import re |
| 22 |
| 23 import mox |
| 24 |
| 25 import mox_test_helper |
| 26 |
| 27 |
| 28 class ExpectedMethodCallsErrorTest(unittest.TestCase): |
| 29 """Test creation and string conversion of ExpectedMethodCallsError.""" |
| 30 |
| 31 def testAtLeastOneMethod(self): |
| 32 self.assertRaises(ValueError, mox.ExpectedMethodCallsError, []) |
| 33 |
| 34 def testOneError(self): |
| 35 method = mox.MockMethod("testMethod", [], False) |
| 36 method(1, 2).AndReturn('output') |
| 37 e = mox.ExpectedMethodCallsError([method]) |
| 38 self.assertEqual( |
| 39 "Verify: Expected methods never called:\n" |
| 40 " 0. testMethod(1, 2) -> 'output'", |
| 41 str(e)) |
| 42 |
| 43 def testManyErrors(self): |
| 44 method1 = mox.MockMethod("testMethod", [], False) |
| 45 method1(1, 2).AndReturn('output') |
| 46 method2 = mox.MockMethod("testMethod", [], False) |
| 47 method2(a=1, b=2, c="only named") |
| 48 method3 = mox.MockMethod("testMethod2", [], False) |
| 49 method3().AndReturn(44) |
| 50 method4 = mox.MockMethod("testMethod", [], False) |
| 51 method4(1, 2).AndReturn('output') |
| 52 e = mox.ExpectedMethodCallsError([method1, method2, method3, method4]) |
| 53 self.assertEqual( |
| 54 "Verify: Expected methods never called:\n" |
| 55 " 0. testMethod(1, 2) -> 'output'\n" |
| 56 " 1. testMethod(a=1, b=2, c='only named') -> None\n" |
| 57 " 2. testMethod2() -> 44\n" |
| 58 " 3. testMethod(1, 2) -> 'output'", |
| 59 str(e)) |
| 60 |
| 61 |
| 62 class OrTest(unittest.TestCase): |
| 63 """Test Or correctly chains Comparators.""" |
| 64 |
| 65 def testValidOr(self): |
| 66 """Or should be True if either Comparator returns True.""" |
| 67 self.assert_(mox.Or(mox.IsA(dict), mox.IsA(str)) == {}) |
| 68 self.assert_(mox.Or(mox.IsA(dict), mox.IsA(str)) == 'test') |
| 69 self.assert_(mox.Or(mox.IsA(str), mox.IsA(str)) == 'test') |
| 70 |
| 71 def testInvalidOr(self): |
| 72 """Or should be False if both Comparators return False.""" |
| 73 self.failIf(mox.Or(mox.IsA(dict), mox.IsA(str)) == 0) |
| 74 |
| 75 |
| 76 class AndTest(unittest.TestCase): |
| 77 """Test And correctly chains Comparators.""" |
| 78 |
| 79 def testValidAnd(self): |
| 80 """And should be True if both Comparators return True.""" |
| 81 self.assert_(mox.And(mox.IsA(str), mox.IsA(str)) == '1') |
| 82 |
| 83 def testClauseOneFails(self): |
| 84 """And should be False if the first Comparator returns False.""" |
| 85 |
| 86 self.failIf(mox.And(mox.IsA(dict), mox.IsA(str)) == '1') |
| 87 |
| 88 def testAdvancedUsage(self): |
| 89 """And should work with other Comparators. |
| 90 |
| 91 Note: this test is reliant on In and ContainsKeyValue. |
| 92 """ |
| 93 test_dict = {"mock" : "obj", "testing" : "isCOOL"} |
| 94 self.assert_(mox.And(mox.In("testing"), |
| 95 mox.ContainsKeyValue("mock", "obj")) == test_dict) |
| 96 |
| 97 def testAdvancedUsageFails(self): |
| 98 """Note: this test is reliant on In and ContainsKeyValue.""" |
| 99 test_dict = {"mock" : "obj", "testing" : "isCOOL"} |
| 100 self.failIf(mox.And(mox.In("NOTFOUND"), |
| 101 mox.ContainsKeyValue("mock", "obj")) == test_dict) |
| 102 |
| 103 |
| 104 class SameElementsAsTest(unittest.TestCase): |
| 105 """Test SameElementsAs correctly identifies sequences with same elements.""" |
| 106 |
| 107 def testSortedLists(self): |
| 108 """Should return True if two lists are exactly equal.""" |
| 109 self.assert_(mox.SameElementsAs([1, 2.0, 'c']) == [1, 2.0, 'c']) |
| 110 |
| 111 def testUnsortedLists(self): |
| 112 """Should return True if two lists are unequal but have same elements.""" |
| 113 self.assert_(mox.SameElementsAs([1, 2.0, 'c']) == [2.0, 'c', 1]) |
| 114 |
| 115 def testUnhashableLists(self): |
| 116 """Should return True if two lists have the same unhashable elements.""" |
| 117 self.assert_(mox.SameElementsAs([{'a': 1}, {2: 'b'}]) == |
| 118 [{2: 'b'}, {'a': 1}]) |
| 119 |
| 120 def testEmptyLists(self): |
| 121 """Should return True for two empty lists.""" |
| 122 self.assert_(mox.SameElementsAs([]) == []) |
| 123 |
| 124 def testUnequalLists(self): |
| 125 """Should return False if the lists are not equal.""" |
| 126 self.failIf(mox.SameElementsAs([1, 2.0, 'c']) == [2.0, 'c']) |
| 127 |
| 128 def testUnequalUnhashableLists(self): |
| 129 """Should return False if two lists with unhashable elements are unequal.""" |
| 130 self.failIf(mox.SameElementsAs([{'a': 1}, {2: 'b'}]) == [{2: 'b'}]) |
| 131 |
| 132 |
| 133 class ContainsKeyValueTest(unittest.TestCase): |
| 134 """Test ContainsKeyValue correctly identifies key/value pairs in a dict. |
| 135 """ |
| 136 |
| 137 def testValidPair(self): |
| 138 """Should return True if the key value is in the dict.""" |
| 139 self.assert_(mox.ContainsKeyValue("key", 1) == {"key": 1}) |
| 140 |
| 141 def testInvalidValue(self): |
| 142 """Should return False if the value is not correct.""" |
| 143 self.failIf(mox.ContainsKeyValue("key", 1) == {"key": 2}) |
| 144 |
| 145 def testInvalidKey(self): |
| 146 """Should return False if they key is not in the dict.""" |
| 147 self.failIf(mox.ContainsKeyValue("qux", 1) == {"key": 2}) |
| 148 |
| 149 |
| 150 class InTest(unittest.TestCase): |
| 151 """Test In correctly identifies a key in a list/dict""" |
| 152 |
| 153 def testItemInList(self): |
| 154 """Should return True if the item is in the list.""" |
| 155 self.assert_(mox.In(1) == [1, 2, 3]) |
| 156 |
| 157 def testKeyInDict(self): |
| 158 """Should return True if the item is a key in a dict.""" |
| 159 self.assert_(mox.In("test") == {"test" : "module"}) |
| 160 |
| 161 |
| 162 class NotTest(unittest.TestCase): |
| 163 """Test Not correctly identifies False predicates.""" |
| 164 |
| 165 def testItemInList(self): |
| 166 """Should return True if the item is NOT in the list.""" |
| 167 self.assert_(mox.Not(mox.In(42)) == [1, 2, 3]) |
| 168 |
| 169 def testKeyInDict(self): |
| 170 """Should return True if the item is NOT a key in a dict.""" |
| 171 self.assert_(mox.Not(mox.In("foo")) == {"key" : 42}) |
| 172 |
| 173 def testInvalidKeyWithNot(self): |
| 174 """Should return False if they key is NOT in the dict.""" |
| 175 self.assert_(mox.Not(mox.ContainsKeyValue("qux", 1)) == {"key": 2}) |
| 176 |
| 177 |
| 178 class StrContainsTest(unittest.TestCase): |
| 179 """Test StrContains correctly checks for substring occurrence of a parameter. |
| 180 """ |
| 181 |
| 182 def testValidSubstringAtStart(self): |
| 183 """Should return True if the substring is at the start of the string.""" |
| 184 self.assert_(mox.StrContains("hello") == "hello world") |
| 185 |
| 186 def testValidSubstringInMiddle(self): |
| 187 """Should return True if the substring is in the middle of the string.""" |
| 188 self.assert_(mox.StrContains("lo wo") == "hello world") |
| 189 |
| 190 def testValidSubstringAtEnd(self): |
| 191 """Should return True if the substring is at the end of the string.""" |
| 192 self.assert_(mox.StrContains("ld") == "hello world") |
| 193 |
| 194 def testInvaildSubstring(self): |
| 195 """Should return False if the substring is not in the string.""" |
| 196 self.failIf(mox.StrContains("AAA") == "hello world") |
| 197 |
| 198 def testMultipleMatches(self): |
| 199 """Should return True if there are multiple occurances of substring.""" |
| 200 self.assert_(mox.StrContains("abc") == "ababcabcabcababc") |
| 201 |
| 202 |
| 203 class RegexTest(unittest.TestCase): |
| 204 """Test Regex correctly matches regular expressions.""" |
| 205 |
| 206 def testIdentifyBadSyntaxDuringInit(self): |
| 207 """The user should know immediately if a regex has bad syntax.""" |
| 208 self.assertRaises(re.error, mox.Regex, '(a|b') |
| 209 |
| 210 def testPatternInMiddle(self): |
| 211 """Should return True if the pattern matches at the middle of the string. |
| 212 |
| 213 This ensures that re.search is used (instead of re.find). |
| 214 """ |
| 215 self.assert_(mox.Regex(r"a\s+b") == "x y z a b c") |
| 216 |
| 217 def testNonMatchPattern(self): |
| 218 """Should return False if the pattern does not match the string.""" |
| 219 self.failIf(mox.Regex(r"a\s+b") == "x y z") |
| 220 |
| 221 def testFlagsPassedCorrectly(self): |
| 222 """Should return True as we pass IGNORECASE flag.""" |
| 223 self.assert_(mox.Regex(r"A", re.IGNORECASE) == "a") |
| 224 |
| 225 def testReprWithoutFlags(self): |
| 226 """repr should return the regular expression pattern.""" |
| 227 self.assert_(repr(mox.Regex(r"a\s+b")) == "<regular expression 'a\s+b'>") |
| 228 |
| 229 def testReprWithFlags(self): |
| 230 """repr should return the regular expression pattern and flags.""" |
| 231 self.assert_(repr(mox.Regex(r"a\s+b", flags=4)) == |
| 232 "<regular expression 'a\s+b', flags=4>") |
| 233 |
| 234 |
| 235 class IsATest(unittest.TestCase): |
| 236 """Verify IsA correctly checks equality based upon class type, not value.""" |
| 237 |
| 238 def testEqualityValid(self): |
| 239 """Verify that == correctly identifies objects of the same type.""" |
| 240 self.assert_(mox.IsA(str) == 'test') |
| 241 |
| 242 def testEqualityInvalid(self): |
| 243 """Verify that == correctly identifies objects of different types.""" |
| 244 self.failIf(mox.IsA(str) == 10) |
| 245 |
| 246 def testInequalityValid(self): |
| 247 """Verify that != identifies objects of different type.""" |
| 248 self.assert_(mox.IsA(str) != 10) |
| 249 |
| 250 def testInequalityInvalid(self): |
| 251 """Verify that != correctly identifies objects of the same type.""" |
| 252 self.failIf(mox.IsA(str) != "test") |
| 253 |
| 254 def testEqualityInListValid(self): |
| 255 """Verify list contents are properly compared.""" |
| 256 isa_list = [mox.IsA(str), mox.IsA(str)] |
| 257 str_list = ["abc", "def"] |
| 258 self.assert_(isa_list == str_list) |
| 259 |
| 260 def testEquailtyInListInvalid(self): |
| 261 """Verify list contents are properly compared.""" |
| 262 isa_list = [mox.IsA(str),mox.IsA(str)] |
| 263 mixed_list = ["abc", 123] |
| 264 self.failIf(isa_list == mixed_list) |
| 265 |
| 266 def testSpecialTypes(self): |
| 267 """Verify that IsA can handle objects like cStringIO.StringIO.""" |
| 268 isA = mox.IsA(cStringIO.StringIO()) |
| 269 stringIO = cStringIO.StringIO() |
| 270 self.assert_(isA == stringIO) |
| 271 |
| 272 |
| 273 class IsAlmostTest(unittest.TestCase): |
| 274 """Verify IsAlmost correctly checks equality of floating point numbers.""" |
| 275 |
| 276 def testEqualityValid(self): |
| 277 """Verify that == correctly identifies nearly equivalent floats.""" |
| 278 self.assertEquals(mox.IsAlmost(1.8999999999), 1.9) |
| 279 |
| 280 def testEqualityInvalid(self): |
| 281 """Verify that == correctly identifies non-equivalent floats.""" |
| 282 self.assertNotEquals(mox.IsAlmost(1.899), 1.9) |
| 283 |
| 284 def testEqualityWithPlaces(self): |
| 285 """Verify that specifying places has the desired effect.""" |
| 286 self.assertNotEquals(mox.IsAlmost(1.899), 1.9) |
| 287 self.assertEquals(mox.IsAlmost(1.899, places=2), 1.9) |
| 288 |
| 289 def testNonNumericTypes(self): |
| 290 """Verify that IsAlmost handles non-numeric types properly.""" |
| 291 |
| 292 self.assertNotEquals(mox.IsAlmost(1.8999999999), '1.9') |
| 293 self.assertNotEquals(mox.IsAlmost('1.8999999999'), 1.9) |
| 294 self.assertNotEquals(mox.IsAlmost('1.8999999999'), '1.9') |
| 295 |
| 296 |
| 297 class MockMethodTest(unittest.TestCase): |
| 298 """Test class to verify that the MockMethod class is working correctly.""" |
| 299 |
| 300 def setUp(self): |
| 301 self.expected_method = mox.MockMethod("testMethod", [], False)(['original']) |
| 302 self.mock_method = mox.MockMethod("testMethod", [self.expected_method], |
| 303 True) |
| 304 |
| 305 def testAndReturnNoneByDefault(self): |
| 306 """Should return None by default.""" |
| 307 return_value = self.mock_method(['original']) |
| 308 self.assert_(return_value == None) |
| 309 |
| 310 def testAndReturnValue(self): |
| 311 """Should return a specificed return value.""" |
| 312 expected_return_value = "test" |
| 313 self.expected_method.AndReturn(expected_return_value) |
| 314 return_value = self.mock_method(['original']) |
| 315 self.assert_(return_value == expected_return_value) |
| 316 |
| 317 def testAndRaiseException(self): |
| 318 """Should raise a specified exception.""" |
| 319 expected_exception = Exception('test exception') |
| 320 self.expected_method.AndRaise(expected_exception) |
| 321 self.assertRaises(Exception, self.mock_method) |
| 322 |
| 323 def testWithSideEffects(self): |
| 324 """Should call state modifier.""" |
| 325 local_list = ['original'] |
| 326 def modifier(mutable_list): |
| 327 self.assertTrue(local_list is mutable_list) |
| 328 mutable_list[0] = 'mutation' |
| 329 self.expected_method.WithSideEffects(modifier).AndReturn(1) |
| 330 self.mock_method(local_list) |
| 331 self.assertEquals('mutation', local_list[0]) |
| 332 |
| 333 def testEqualityNoParamsEqual(self): |
| 334 """Methods with the same name and without params should be equal.""" |
| 335 expected_method = mox.MockMethod("testMethod", [], False) |
| 336 self.assertEqual(self.mock_method, expected_method) |
| 337 |
| 338 def testEqualityNoParamsNotEqual(self): |
| 339 """Methods with different names and without params should not be equal.""" |
| 340 expected_method = mox.MockMethod("otherMethod", [], False) |
| 341 self.failIfEqual(self.mock_method, expected_method) |
| 342 |
| 343 def testEqualityParamsEqual(self): |
| 344 """Methods with the same name and parameters should be equal.""" |
| 345 params = [1, 2, 3] |
| 346 expected_method = mox.MockMethod("testMethod", [], False) |
| 347 expected_method._params = params |
| 348 |
| 349 self.mock_method._params = params |
| 350 self.assertEqual(self.mock_method, expected_method) |
| 351 |
| 352 def testEqualityParamsNotEqual(self): |
| 353 """Methods with the same name and different params should not be equal.""" |
| 354 expected_method = mox.MockMethod("testMethod", [], False) |
| 355 expected_method._params = [1, 2, 3] |
| 356 |
| 357 self.mock_method._params = ['a', 'b', 'c'] |
| 358 self.failIfEqual(self.mock_method, expected_method) |
| 359 |
| 360 def testEqualityNamedParamsEqual(self): |
| 361 """Methods with the same name and same named params should be equal.""" |
| 362 named_params = {"input1": "test", "input2": "params"} |
| 363 expected_method = mox.MockMethod("testMethod", [], False) |
| 364 expected_method._named_params = named_params |
| 365 |
| 366 self.mock_method._named_params = named_params |
| 367 self.assertEqual(self.mock_method, expected_method) |
| 368 |
| 369 def testEqualityNamedParamsNotEqual(self): |
| 370 """Methods with the same name and diffnamed params should not be equal.""" |
| 371 expected_method = mox.MockMethod("testMethod", [], False) |
| 372 expected_method._named_params = {"input1": "test", "input2": "params"} |
| 373 |
| 374 self.mock_method._named_params = {"input1": "test2", "input2": "params2"} |
| 375 self.failIfEqual(self.mock_method, expected_method) |
| 376 |
| 377 def testEqualityWrongType(self): |
| 378 """Method should not be equal to an object of a different type.""" |
| 379 self.failIfEqual(self.mock_method, "string?") |
| 380 |
| 381 def testObjectEquality(self): |
| 382 """Equality of objects should work without a Comparator""" |
| 383 instA = TestClass(); |
| 384 instB = TestClass(); |
| 385 |
| 386 params = [instA, ] |
| 387 expected_method = mox.MockMethod("testMethod", [], False) |
| 388 expected_method._params = params |
| 389 |
| 390 self.mock_method._params = [instB, ] |
| 391 self.assertEqual(self.mock_method, expected_method) |
| 392 |
| 393 def testStrConversion(self): |
| 394 method = mox.MockMethod("f", [], False) |
| 395 method(1, 2, "st", n1=8, n2="st2") |
| 396 self.assertEqual(str(method), ("f(1, 2, 'st', n1=8, n2='st2') -> None")) |
| 397 |
| 398 method = mox.MockMethod("testMethod", [], False) |
| 399 method(1, 2, "only positional") |
| 400 self.assertEqual(str(method), "testMethod(1, 2, 'only positional') -> None") |
| 401 |
| 402 method = mox.MockMethod("testMethod", [], False) |
| 403 method(a=1, b=2, c="only named") |
| 404 self.assertEqual(str(method), |
| 405 "testMethod(a=1, b=2, c='only named') -> None") |
| 406 |
| 407 method = mox.MockMethod("testMethod", [], False) |
| 408 method() |
| 409 self.assertEqual(str(method), "testMethod() -> None") |
| 410 |
| 411 method = mox.MockMethod("testMethod", [], False) |
| 412 method(x="only 1 parameter") |
| 413 self.assertEqual(str(method), "testMethod(x='only 1 parameter') -> None") |
| 414 |
| 415 method = mox.MockMethod("testMethod", [], False) |
| 416 method().AndReturn('return_value') |
| 417 self.assertEqual(str(method), "testMethod() -> 'return_value'") |
| 418 |
| 419 method = mox.MockMethod("testMethod", [], False) |
| 420 method().AndReturn(('a', {1: 2})) |
| 421 self.assertEqual(str(method), "testMethod() -> ('a', {1: 2})") |
| 422 |
| 423 |
| 424 class MockAnythingTest(unittest.TestCase): |
| 425 """Verify that the MockAnything class works as expected.""" |
| 426 |
| 427 def setUp(self): |
| 428 self.mock_object = mox.MockAnything() |
| 429 |
| 430 def testRepr(self): |
| 431 """Calling repr on a MockAnything instance must work.""" |
| 432 self.assertEqual('<MockAnything instance>', repr(self.mock_object)) |
| 433 |
| 434 def testSetupMode(self): |
| 435 """Verify the mock will accept any call.""" |
| 436 self.mock_object.NonsenseCall() |
| 437 self.assert_(len(self.mock_object._expected_calls_queue) == 1) |
| 438 |
| 439 def testReplayWithExpectedCall(self): |
| 440 """Verify the mock replays method calls as expected.""" |
| 441 self.mock_object.ValidCall() # setup method call |
| 442 self.mock_object._Replay() # start replay mode |
| 443 self.mock_object.ValidCall() # make method call |
| 444 |
| 445 def testReplayWithUnexpectedCall(self): |
| 446 """Unexpected method calls should raise UnexpectedMethodCallError.""" |
| 447 self.mock_object.ValidCall() # setup method call |
| 448 self.mock_object._Replay() # start replay mode |
| 449 self.assertRaises(mox.UnexpectedMethodCallError, |
| 450 self.mock_object.OtherValidCall) |
| 451 |
| 452 def testVerifyWithCompleteReplay(self): |
| 453 """Verify should not raise an exception for a valid replay.""" |
| 454 self.mock_object.ValidCall() # setup method call |
| 455 self.mock_object._Replay() # start replay mode |
| 456 self.mock_object.ValidCall() # make method call |
| 457 self.mock_object._Verify() |
| 458 |
| 459 def testVerifyWithIncompleteReplay(self): |
| 460 """Verify should raise an exception if the replay was not complete.""" |
| 461 self.mock_object.ValidCall() # setup method call |
| 462 self.mock_object._Replay() # start replay mode |
| 463 # ValidCall() is never made |
| 464 self.assertRaises(mox.ExpectedMethodCallsError, self.mock_object._Verify) |
| 465 |
| 466 def testSpecialClassMethod(self): |
| 467 """Verify should not raise an exception when special methods are used.""" |
| 468 self.mock_object[1].AndReturn(True) |
| 469 self.mock_object._Replay() |
| 470 returned_val = self.mock_object[1] |
| 471 self.assert_(returned_val) |
| 472 self.mock_object._Verify() |
| 473 |
| 474 def testNonzero(self): |
| 475 """You should be able to use the mock object in an if.""" |
| 476 self.mock_object._Replay() |
| 477 if self.mock_object: |
| 478 pass |
| 479 |
| 480 def testNotNone(self): |
| 481 """Mock should be comparable to None.""" |
| 482 self.mock_object._Replay() |
| 483 if self.mock_object is not None: |
| 484 pass |
| 485 |
| 486 if self.mock_object is None: |
| 487 pass |
| 488 |
| 489 def testEquals(self): |
| 490 """A mock should be able to compare itself to another object.""" |
| 491 self.mock_object._Replay() |
| 492 self.assertEquals(self.mock_object, self.mock_object) |
| 493 |
| 494 def testEqualsMockFailure(self): |
| 495 """Verify equals identifies unequal objects.""" |
| 496 self.mock_object.SillyCall() |
| 497 self.mock_object._Replay() |
| 498 self.assertNotEquals(self.mock_object, mox.MockAnything()) |
| 499 |
| 500 def testEqualsInstanceFailure(self): |
| 501 """Verify equals identifies that objects are different instances.""" |
| 502 self.mock_object._Replay() |
| 503 self.assertNotEquals(self.mock_object, TestClass()) |
| 504 |
| 505 def testNotEquals(self): |
| 506 """Verify not equals works.""" |
| 507 self.mock_object._Replay() |
| 508 self.assertFalse(self.mock_object != self.mock_object) |
| 509 |
| 510 def testNestedMockCallsRecordedSerially(self): |
| 511 """Test that nested calls work when recorded serially.""" |
| 512 self.mock_object.CallInner().AndReturn(1) |
| 513 self.mock_object.CallOuter(1) |
| 514 self.mock_object._Replay() |
| 515 |
| 516 self.mock_object.CallOuter(self.mock_object.CallInner()) |
| 517 |
| 518 self.mock_object._Verify() |
| 519 |
| 520 def testNestedMockCallsRecordedNested(self): |
| 521 """Test that nested cals work when recorded in a nested fashion.""" |
| 522 self.mock_object.CallOuter(self.mock_object.CallInner().AndReturn(1)) |
| 523 self.mock_object._Replay() |
| 524 |
| 525 self.mock_object.CallOuter(self.mock_object.CallInner()) |
| 526 |
| 527 self.mock_object._Verify() |
| 528 |
| 529 def testIsCallable(self): |
| 530 """Test that MockAnything can even mock a simple callable. |
| 531 |
| 532 This is handy for "stubbing out" a method in a module with a mock, and |
| 533 verifying that it was called. |
| 534 """ |
| 535 self.mock_object().AndReturn('mox0rd') |
| 536 self.mock_object._Replay() |
| 537 |
| 538 self.assertEquals('mox0rd', self.mock_object()) |
| 539 |
| 540 self.mock_object._Verify() |
| 541 |
| 542 def testIsReprable(self): |
| 543 """Test that MockAnythings can be repr'd without causing a failure.""" |
| 544 self.failUnless('MockAnything' in repr(self.mock_object)) |
| 545 |
| 546 |
| 547 class MethodCheckerTest(unittest.TestCase): |
| 548 """Tests MockMethod's use of MethodChecker method.""" |
| 549 |
| 550 def testNoParameters(self): |
| 551 method = mox.MockMethod('NoParameters', [], False, |
| 552 CheckCallTestClass.NoParameters) |
| 553 method() |
| 554 self.assertRaises(AttributeError, method, 1) |
| 555 self.assertRaises(AttributeError, method, 1, 2) |
| 556 self.assertRaises(AttributeError, method, a=1) |
| 557 self.assertRaises(AttributeError, method, 1, b=2) |
| 558 |
| 559 def testOneParameter(self): |
| 560 method = mox.MockMethod('OneParameter', [], False, |
| 561 CheckCallTestClass.OneParameter) |
| 562 self.assertRaises(AttributeError, method) |
| 563 method(1) |
| 564 method(a=1) |
| 565 self.assertRaises(AttributeError, method, b=1) |
| 566 self.assertRaises(AttributeError, method, 1, 2) |
| 567 self.assertRaises(AttributeError, method, 1, a=2) |
| 568 self.assertRaises(AttributeError, method, 1, b=2) |
| 569 |
| 570 def testTwoParameters(self): |
| 571 method = mox.MockMethod('TwoParameters', [], False, |
| 572 CheckCallTestClass.TwoParameters) |
| 573 self.assertRaises(AttributeError, method) |
| 574 self.assertRaises(AttributeError, method, 1) |
| 575 self.assertRaises(AttributeError, method, a=1) |
| 576 self.assertRaises(AttributeError, method, b=1) |
| 577 method(1, 2) |
| 578 method(1, b=2) |
| 579 method(a=1, b=2) |
| 580 method(b=2, a=1) |
| 581 self.assertRaises(AttributeError, method, b=2, c=3) |
| 582 self.assertRaises(AttributeError, method, a=1, b=2, c=3) |
| 583 self.assertRaises(AttributeError, method, 1, 2, 3) |
| 584 self.assertRaises(AttributeError, method, 1, 2, 3, 4) |
| 585 self.assertRaises(AttributeError, method, 3, a=1, b=2) |
| 586 |
| 587 def testOneDefaultValue(self): |
| 588 method = mox.MockMethod('OneDefaultValue', [], False, |
| 589 CheckCallTestClass.OneDefaultValue) |
| 590 method() |
| 591 method(1) |
| 592 method(a=1) |
| 593 self.assertRaises(AttributeError, method, b=1) |
| 594 self.assertRaises(AttributeError, method, 1, 2) |
| 595 self.assertRaises(AttributeError, method, 1, a=2) |
| 596 self.assertRaises(AttributeError, method, 1, b=2) |
| 597 |
| 598 def testTwoDefaultValues(self): |
| 599 method = mox.MockMethod('TwoDefaultValues', [], False, |
| 600 CheckCallTestClass.TwoDefaultValues) |
| 601 self.assertRaises(AttributeError, method) |
| 602 self.assertRaises(AttributeError, method, c=3) |
| 603 self.assertRaises(AttributeError, method, 1) |
| 604 self.assertRaises(AttributeError, method, 1, d=4) |
| 605 self.assertRaises(AttributeError, method, 1, d=4, c=3) |
| 606 method(1, 2) |
| 607 method(a=1, b=2) |
| 608 method(1, 2, 3) |
| 609 method(1, 2, 3, 4) |
| 610 method(1, 2, c=3) |
| 611 method(1, 2, c=3, d=4) |
| 612 method(1, 2, d=4, c=3) |
| 613 method(d=4, c=3, a=1, b=2) |
| 614 self.assertRaises(AttributeError, method, 1, 2, 3, 4, 5) |
| 615 self.assertRaises(AttributeError, method, 1, 2, e=9) |
| 616 self.assertRaises(AttributeError, method, a=1, b=2, e=9) |
| 617 |
| 618 def testArgs(self): |
| 619 method = mox.MockMethod('Args', [], False, CheckCallTestClass.Args) |
| 620 self.assertRaises(AttributeError, method) |
| 621 self.assertRaises(AttributeError, method, 1) |
| 622 method(1, 2) |
| 623 method(a=1, b=2) |
| 624 method(1, 2, 3) |
| 625 method(1, 2, 3, 4) |
| 626 self.assertRaises(AttributeError, method, 1, 2, a=3) |
| 627 self.assertRaises(AttributeError, method, 1, 2, c=3) |
| 628 |
| 629 def testKwargs(self): |
| 630 method = mox.MockMethod('Kwargs', [], False, CheckCallTestClass.Kwargs) |
| 631 self.assertRaises(AttributeError, method) |
| 632 method(1) |
| 633 method(1, 2) |
| 634 method(a=1, b=2) |
| 635 method(b=2, a=1) |
| 636 self.assertRaises(AttributeError, method, 1, 2, 3) |
| 637 self.assertRaises(AttributeError, method, 1, 2, a=3) |
| 638 method(1, 2, c=3) |
| 639 method(a=1, b=2, c=3) |
| 640 method(c=3, a=1, b=2) |
| 641 method(a=1, b=2, c=3, d=4) |
| 642 self.assertRaises(AttributeError, method, 1, 2, 3, 4) |
| 643 |
| 644 def testArgsAndKwargs(self): |
| 645 method = mox.MockMethod('ArgsAndKwargs', [], False, |
| 646 CheckCallTestClass.ArgsAndKwargs) |
| 647 self.assertRaises(AttributeError, method) |
| 648 method(1) |
| 649 method(1, 2) |
| 650 method(1, 2, 3) |
| 651 method(a=1) |
| 652 method(1, b=2) |
| 653 self.assertRaises(AttributeError, method, 1, a=2) |
| 654 method(b=2, a=1) |
| 655 method(c=3, b=2, a=1) |
| 656 method(1, 2, c=3) |
| 657 |
| 658 |
| 659 class CheckCallTestClass(object): |
| 660 def NoParameters(self): |
| 661 pass |
| 662 |
| 663 def OneParameter(self, a): |
| 664 pass |
| 665 |
| 666 def TwoParameters(self, a, b): |
| 667 pass |
| 668 |
| 669 def OneDefaultValue(self, a=1): |
| 670 pass |
| 671 |
| 672 def TwoDefaultValues(self, a, b, c=1, d=2): |
| 673 pass |
| 674 |
| 675 def Args(self, a, b, *args): |
| 676 pass |
| 677 |
| 678 def Kwargs(self, a, b=2, **kwargs): |
| 679 pass |
| 680 |
| 681 def ArgsAndKwargs(self, a, *args, **kwargs): |
| 682 pass |
| 683 |
| 684 |
| 685 class MockObjectTest(unittest.TestCase): |
| 686 """Verify that the MockObject class works as exepcted.""" |
| 687 |
| 688 def setUp(self): |
| 689 self.mock_object = mox.MockObject(TestClass) |
| 690 |
| 691 def testSetupModeWithValidCall(self): |
| 692 """Verify the mock object properly mocks a basic method call.""" |
| 693 self.mock_object.ValidCall() |
| 694 self.assert_(len(self.mock_object._expected_calls_queue) == 1) |
| 695 |
| 696 def testSetupModeWithInvalidCall(self): |
| 697 """UnknownMethodCallError should be raised if a non-member method is called. |
| 698 """ |
| 699 # Note: assertRaises does not catch exceptions thrown by MockObject's |
| 700 # __getattr__ |
| 701 try: |
| 702 self.mock_object.InvalidCall() |
| 703 self.fail("No exception thrown, expected UnknownMethodCallError") |
| 704 except mox.UnknownMethodCallError: |
| 705 pass |
| 706 except Exception: |
| 707 self.fail("Wrong exception type thrown, expected UnknownMethodCallError") |
| 708 |
| 709 def testReplayWithInvalidCall(self): |
| 710 """UnknownMethodCallError should be raised if a non-member method is called. |
| 711 """ |
| 712 self.mock_object.ValidCall() # setup method call |
| 713 self.mock_object._Replay() # start replay mode |
| 714 # Note: assertRaises does not catch exceptions thrown by MockObject's |
| 715 # __getattr__ |
| 716 try: |
| 717 self.mock_object.InvalidCall() |
| 718 self.fail("No exception thrown, expected UnknownMethodCallError") |
| 719 except mox.UnknownMethodCallError: |
| 720 pass |
| 721 except Exception: |
| 722 self.fail("Wrong exception type thrown, expected UnknownMethodCallError") |
| 723 |
| 724 def testIsInstance(self): |
| 725 """Mock should be able to pass as an instance of the mocked class.""" |
| 726 self.assert_(isinstance(self.mock_object, TestClass)) |
| 727 |
| 728 def testFindValidMethods(self): |
| 729 """Mock should be able to mock all public methods.""" |
| 730 self.assert_('ValidCall' in self.mock_object._known_methods) |
| 731 self.assert_('OtherValidCall' in self.mock_object._known_methods) |
| 732 self.assert_('MyClassMethod' in self.mock_object._known_methods) |
| 733 self.assert_('MyStaticMethod' in self.mock_object._known_methods) |
| 734 self.assert_('_ProtectedCall' in self.mock_object._known_methods) |
| 735 self.assert_('__PrivateCall' not in self.mock_object._known_methods) |
| 736 self.assert_('_TestClass__PrivateCall' in self.mock_object._known_methods) |
| 737 |
| 738 def testFindsSuperclassMethods(self): |
| 739 """Mock should be able to mock superclasses methods.""" |
| 740 self.mock_object = mox.MockObject(ChildClass) |
| 741 self.assert_('ValidCall' in self.mock_object._known_methods) |
| 742 self.assert_('OtherValidCall' in self.mock_object._known_methods) |
| 743 self.assert_('MyClassMethod' in self.mock_object._known_methods) |
| 744 self.assert_('ChildValidCall' in self.mock_object._known_methods) |
| 745 |
| 746 def testAccessClassVariables(self): |
| 747 """Class variables should be accessible through the mock.""" |
| 748 self.assert_('SOME_CLASS_VAR' in self.mock_object._known_vars) |
| 749 self.assert_('_PROTECTED_CLASS_VAR' in self.mock_object._known_vars) |
| 750 self.assertEquals('test_value', self.mock_object.SOME_CLASS_VAR) |
| 751 |
| 752 def testEquals(self): |
| 753 """A mock should be able to compare itself to another object.""" |
| 754 self.mock_object._Replay() |
| 755 self.assertEquals(self.mock_object, self.mock_object) |
| 756 |
| 757 def testEqualsMockFailure(self): |
| 758 """Verify equals identifies unequal objects.""" |
| 759 self.mock_object.ValidCall() |
| 760 self.mock_object._Replay() |
| 761 self.assertNotEquals(self.mock_object, mox.MockObject(TestClass)) |
| 762 |
| 763 def testEqualsInstanceFailure(self): |
| 764 """Verify equals identifies that objects are different instances.""" |
| 765 self.mock_object._Replay() |
| 766 self.assertNotEquals(self.mock_object, TestClass()) |
| 767 |
| 768 def testNotEquals(self): |
| 769 """Verify not equals works.""" |
| 770 self.mock_object._Replay() |
| 771 self.assertFalse(self.mock_object != self.mock_object) |
| 772 |
| 773 def testMockSetItem_ExpectedSetItem_Success(self): |
| 774 """Test that __setitem__() gets mocked in Dummy. |
| 775 |
| 776 In this test, _Verify() succeeds. |
| 777 """ |
| 778 dummy = mox.MockObject(TestClass) |
| 779 dummy['X'] = 'Y' |
| 780 |
| 781 dummy._Replay() |
| 782 |
| 783 dummy['X'] = 'Y' |
| 784 |
| 785 dummy._Verify() |
| 786 |
| 787 def testMockSetItem_ExpectedSetItem_NoSuccess(self): |
| 788 """Test that __setitem__() gets mocked in Dummy. |
| 789 |
| 790 In this test, _Verify() fails. |
| 791 """ |
| 792 dummy = mox.MockObject(TestClass) |
| 793 dummy['X'] = 'Y' |
| 794 |
| 795 dummy._Replay() |
| 796 |
| 797 # NOT doing dummy['X'] = 'Y' |
| 798 |
| 799 self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify) |
| 800 |
| 801 def testMockSetItem_ExpectedNoSetItem_Success(self): |
| 802 """Test that __setitem__() gets mocked in Dummy.""" |
| 803 dummy = mox.MockObject(TestClass) |
| 804 # NOT doing dummy['X'] = 'Y' |
| 805 |
| 806 dummy._Replay() |
| 807 |
| 808 def call(): dummy['X'] = 'Y' |
| 809 self.assertRaises(mox.UnexpectedMethodCallError, call) |
| 810 |
| 811 def testMockSetItem_ExpectedNoSetItem_NoSuccess(self): |
| 812 """Test that __setitem__() gets mocked in Dummy. |
| 813 |
| 814 In this test, _Verify() fails. |
| 815 """ |
| 816 dummy = mox.MockObject(TestClass) |
| 817 # NOT doing dummy['X'] = 'Y' |
| 818 |
| 819 dummy._Replay() |
| 820 |
| 821 # NOT doing dummy['X'] = 'Y' |
| 822 |
| 823 dummy._Verify() |
| 824 |
| 825 def testMockSetItem_ExpectedSetItem_NonmatchingParameters(self): |
| 826 """Test that __setitem__() fails if other parameters are expected.""" |
| 827 dummy = mox.MockObject(TestClass) |
| 828 dummy['X'] = 'Y' |
| 829 |
| 830 dummy._Replay() |
| 831 |
| 832 def call(): dummy['wrong'] = 'Y' |
| 833 |
| 834 self.assertRaises(mox.UnexpectedMethodCallError, call) |
| 835 |
| 836 dummy._Verify() |
| 837 |
| 838 def testMockSetItem_WithSubClassOfNewStyleClass(self): |
| 839 class NewStyleTestClass(object): |
| 840 def __init__(self): |
| 841 self.my_dict = {} |
| 842 |
| 843 def __setitem__(self, key, value): |
| 844 self.my_dict[key], value |
| 845 |
| 846 class TestSubClass(NewStyleTestClass): |
| 847 pass |
| 848 |
| 849 dummy = mox.MockObject(TestSubClass) |
| 850 dummy[1] = 2 |
| 851 dummy._Replay() |
| 852 dummy[1] = 2 |
| 853 dummy._Verify() |
| 854 |
| 855 def testMockGetItem_ExpectedGetItem_Success(self): |
| 856 """Test that __getitem__() gets mocked in Dummy. |
| 857 |
| 858 In this test, _Verify() succeeds. |
| 859 """ |
| 860 dummy = mox.MockObject(TestClass) |
| 861 dummy['X'].AndReturn('value') |
| 862 |
| 863 dummy._Replay() |
| 864 |
| 865 self.assertEqual(dummy['X'], 'value') |
| 866 |
| 867 dummy._Verify() |
| 868 |
| 869 def testMockGetItem_ExpectedGetItem_NoSuccess(self): |
| 870 """Test that __getitem__() gets mocked in Dummy. |
| 871 |
| 872 In this test, _Verify() fails. |
| 873 """ |
| 874 dummy = mox.MockObject(TestClass) |
| 875 dummy['X'].AndReturn('value') |
| 876 |
| 877 dummy._Replay() |
| 878 |
| 879 # NOT doing dummy['X'] |
| 880 |
| 881 self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify) |
| 882 |
| 883 def testMockGetItem_ExpectedNoGetItem_NoSuccess(self): |
| 884 """Test that __getitem__() gets mocked in Dummy.""" |
| 885 dummy = mox.MockObject(TestClass) |
| 886 # NOT doing dummy['X'] |
| 887 |
| 888 dummy._Replay() |
| 889 |
| 890 def call(): return dummy['X'] |
| 891 self.assertRaises(mox.UnexpectedMethodCallError, call) |
| 892 |
| 893 def testMockGetItem_ExpectedGetItem_NonmatchingParameters(self): |
| 894 """Test that __getitem__() fails if other parameters are expected.""" |
| 895 dummy = mox.MockObject(TestClass) |
| 896 dummy['X'].AndReturn('value') |
| 897 |
| 898 dummy._Replay() |
| 899 |
| 900 def call(): return dummy['wrong'] |
| 901 |
| 902 self.assertRaises(mox.UnexpectedMethodCallError, call) |
| 903 |
| 904 dummy._Verify() |
| 905 |
| 906 def testMockGetItem_WithSubClassOfNewStyleClass(self): |
| 907 class NewStyleTestClass(object): |
| 908 def __getitem__(self, key): |
| 909 return {1: '1', 2: '2'}[key] |
| 910 |
| 911 class TestSubClass(NewStyleTestClass): |
| 912 pass |
| 913 |
| 914 dummy = mox.MockObject(TestSubClass) |
| 915 dummy[1].AndReturn('3') |
| 916 |
| 917 dummy._Replay() |
| 918 self.assertEquals('3', dummy.__getitem__(1)) |
| 919 dummy._Verify() |
| 920 |
| 921 def testMockIter_ExpectedIter_Success(self): |
| 922 """Test that __iter__() gets mocked in Dummy. |
| 923 |
| 924 In this test, _Verify() succeeds. |
| 925 """ |
| 926 dummy = mox.MockObject(TestClass) |
| 927 iter(dummy).AndReturn(iter(['X', 'Y'])) |
| 928 |
| 929 dummy._Replay() |
| 930 |
| 931 self.assertEqual([x for x in dummy], ['X', 'Y']) |
| 932 |
| 933 dummy._Verify() |
| 934 def testMockContains_ExpectedContains_Success(self): |
| 935 """Test that __contains__ gets mocked in Dummy. |
| 936 |
| 937 In this test, _Verify() succeeds. |
| 938 """ |
| 939 dummy = mox.MockObject(TestClass) |
| 940 dummy.__contains__('X').AndReturn(True) |
| 941 |
| 942 dummy._Replay() |
| 943 |
| 944 self.failUnless('X' in dummy) |
| 945 |
| 946 dummy._Verify() |
| 947 |
| 948 def testMockContains_ExpectedContains_NoSuccess(self): |
| 949 """Test that __contains__() gets mocked in Dummy. |
| 950 |
| 951 In this test, _Verify() fails. |
| 952 """ |
| 953 dummy = mox.MockObject(TestClass) |
| 954 dummy.__contains__('X').AndReturn('True') |
| 955 |
| 956 dummy._Replay() |
| 957 |
| 958 # NOT doing 'X' in dummy |
| 959 |
| 960 self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify) |
| 961 |
| 962 def testMockContains_ExpectedContains_NonmatchingParameter(self): |
| 963 """Test that __contains__ fails if other parameters are expected.""" |
| 964 dummy = mox.MockObject(TestClass) |
| 965 dummy.__contains__('X').AndReturn(True) |
| 966 |
| 967 dummy._Replay() |
| 968 |
| 969 def call(): return 'Y' in dummy |
| 970 |
| 971 self.assertRaises(mox.UnexpectedMethodCallError, call) |
| 972 |
| 973 dummy._Verify() |
| 974 |
| 975 def testMockIter_ExpectedIter_NoSuccess(self): |
| 976 """Test that __iter__() gets mocked in Dummy. |
| 977 |
| 978 In this test, _Verify() fails. |
| 979 """ |
| 980 dummy = mox.MockObject(TestClass) |
| 981 iter(dummy).AndReturn(iter(['X', 'Y'])) |
| 982 |
| 983 dummy._Replay() |
| 984 |
| 985 # NOT doing self.assertEqual([x for x in dummy], ['X', 'Y']) |
| 986 |
| 987 self.assertRaises(mox.ExpectedMethodCallsError, dummy._Verify) |
| 988 |
| 989 def testMockIter_ExpectedNoIter_NoSuccess(self): |
| 990 """Test that __iter__() gets mocked in Dummy.""" |
| 991 dummy = mox.MockObject(TestClass) |
| 992 # NOT doing iter(dummy) |
| 993 |
| 994 dummy._Replay() |
| 995 |
| 996 def call(): return [x for x in dummy] |
| 997 self.assertRaises(mox.UnexpectedMethodCallError, call) |
| 998 |
| 999 def testMockIter_ExpectedGetItem_Success(self): |
| 1000 """Test that __iter__() gets mocked in Dummy using getitem.""" |
| 1001 dummy = mox.MockObject(SubscribtableNonIterableClass) |
| 1002 dummy[0].AndReturn('a') |
| 1003 dummy[1].AndReturn('b') |
| 1004 dummy[2].AndRaise(IndexError) |
| 1005 |
| 1006 dummy._Replay() |
| 1007 self.assertEquals(['a', 'b'], [x for x in dummy]) |
| 1008 dummy._Verify() |
| 1009 |
| 1010 def testMockIter_ExpectedNoGetItem_NoSuccess(self): |
| 1011 """Test that __iter__() gets mocked in Dummy using getitem.""" |
| 1012 dummy = mox.MockObject(SubscribtableNonIterableClass) |
| 1013 # NOT doing dummy[index] |
| 1014 |
| 1015 dummy._Replay() |
| 1016 function = lambda: [x for x in dummy] |
| 1017 self.assertRaises(mox.UnexpectedMethodCallError, function) |
| 1018 |
| 1019 def testMockGetIter_WithSubClassOfNewStyleClass(self): |
| 1020 class NewStyleTestClass(object): |
| 1021 def __iter__(self): |
| 1022 return iter([1, 2, 3]) |
| 1023 |
| 1024 class TestSubClass(NewStyleTestClass): |
| 1025 pass |
| 1026 |
| 1027 dummy = mox.MockObject(TestSubClass) |
| 1028 iter(dummy).AndReturn(iter(['a', 'b'])) |
| 1029 dummy._Replay() |
| 1030 self.assertEquals(['a', 'b'], [x for x in dummy]) |
| 1031 dummy._Verify() |
| 1032 |
| 1033 |
| 1034 class MoxTest(unittest.TestCase): |
| 1035 """Verify Mox works correctly.""" |
| 1036 |
| 1037 def setUp(self): |
| 1038 self.mox = mox.Mox() |
| 1039 |
| 1040 def testCreateObject(self): |
| 1041 """Mox should create a mock object.""" |
| 1042 mock_obj = self.mox.CreateMock(TestClass) |
| 1043 |
| 1044 def testVerifyObjectWithCompleteReplay(self): |
| 1045 """Mox should replay and verify all objects it created.""" |
| 1046 mock_obj = self.mox.CreateMock(TestClass) |
| 1047 mock_obj.ValidCall() |
| 1048 mock_obj.ValidCallWithArgs(mox.IsA(TestClass)) |
| 1049 self.mox.ReplayAll() |
| 1050 mock_obj.ValidCall() |
| 1051 mock_obj.ValidCallWithArgs(TestClass("some_value")) |
| 1052 self.mox.VerifyAll() |
| 1053 |
| 1054 def testVerifyObjectWithIncompleteReplay(self): |
| 1055 """Mox should raise an exception if a mock didn't replay completely.""" |
| 1056 mock_obj = self.mox.CreateMock(TestClass) |
| 1057 mock_obj.ValidCall() |
| 1058 self.mox.ReplayAll() |
| 1059 # ValidCall() is never made |
| 1060 self.assertRaises(mox.ExpectedMethodCallsError, self.mox.VerifyAll) |
| 1061 |
| 1062 def testEntireWorkflow(self): |
| 1063 """Test the whole work flow.""" |
| 1064 mock_obj = self.mox.CreateMock(TestClass) |
| 1065 mock_obj.ValidCall().AndReturn("yes") |
| 1066 self.mox.ReplayAll() |
| 1067 |
| 1068 ret_val = mock_obj.ValidCall() |
| 1069 self.assertEquals("yes", ret_val) |
| 1070 self.mox.VerifyAll() |
| 1071 |
| 1072 def testCallableObject(self): |
| 1073 """Test recording calls to a callable object works.""" |
| 1074 mock_obj = self.mox.CreateMock(CallableClass) |
| 1075 mock_obj("foo").AndReturn("qux") |
| 1076 self.mox.ReplayAll() |
| 1077 |
| 1078 ret_val = mock_obj("foo") |
| 1079 self.assertEquals("qux", ret_val) |
| 1080 self.mox.VerifyAll() |
| 1081 |
| 1082 def testInheritedCallableObject(self): |
| 1083 """Test recording calls to an object inheriting from a callable object.""" |
| 1084 mock_obj = self.mox.CreateMock(InheritsFromCallable) |
| 1085 mock_obj("foo").AndReturn("qux") |
| 1086 self.mox.ReplayAll() |
| 1087 |
| 1088 ret_val = mock_obj("foo") |
| 1089 self.assertEquals("qux", ret_val) |
| 1090 self.mox.VerifyAll() |
| 1091 |
| 1092 def testCallOnNonCallableObject(self): |
| 1093 """Test that you cannot call a non-callable object.""" |
| 1094 mock_obj = self.mox.CreateMock(TestClass) |
| 1095 self.assertRaises(TypeError, mock_obj) |
| 1096 |
| 1097 def testCallableObjectWithBadCall(self): |
| 1098 """Test verifying calls to a callable object works.""" |
| 1099 mock_obj = self.mox.CreateMock(CallableClass) |
| 1100 mock_obj("foo").AndReturn("qux") |
| 1101 self.mox.ReplayAll() |
| 1102 |
| 1103 self.assertRaises(mox.UnexpectedMethodCallError, mock_obj, "ZOOBAZ") |
| 1104 |
| 1105 def testUnorderedGroup(self): |
| 1106 """Test that using one unordered group works.""" |
| 1107 mock_obj = self.mox.CreateMockAnything() |
| 1108 mock_obj.Method(1).InAnyOrder() |
| 1109 mock_obj.Method(2).InAnyOrder() |
| 1110 self.mox.ReplayAll() |
| 1111 |
| 1112 mock_obj.Method(2) |
| 1113 mock_obj.Method(1) |
| 1114 |
| 1115 self.mox.VerifyAll() |
| 1116 |
| 1117 def testUnorderedGroupsInline(self): |
| 1118 """Unordered groups should work in the context of ordered calls.""" |
| 1119 mock_obj = self.mox.CreateMockAnything() |
| 1120 mock_obj.Open() |
| 1121 mock_obj.Method(1).InAnyOrder() |
| 1122 mock_obj.Method(2).InAnyOrder() |
| 1123 mock_obj.Close() |
| 1124 self.mox.ReplayAll() |
| 1125 |
| 1126 mock_obj.Open() |
| 1127 mock_obj.Method(2) |
| 1128 mock_obj.Method(1) |
| 1129 mock_obj.Close() |
| 1130 |
| 1131 self.mox.VerifyAll() |
| 1132 |
| 1133 def testMultipleUnorderdGroups(self): |
| 1134 """Multiple unoreded groups should work.""" |
| 1135 mock_obj = self.mox.CreateMockAnything() |
| 1136 mock_obj.Method(1).InAnyOrder() |
| 1137 mock_obj.Method(2).InAnyOrder() |
| 1138 mock_obj.Foo().InAnyOrder('group2') |
| 1139 mock_obj.Bar().InAnyOrder('group2') |
| 1140 self.mox.ReplayAll() |
| 1141 |
| 1142 mock_obj.Method(2) |
| 1143 mock_obj.Method(1) |
| 1144 mock_obj.Bar() |
| 1145 mock_obj.Foo() |
| 1146 |
| 1147 self.mox.VerifyAll() |
| 1148 |
| 1149 def testMultipleUnorderdGroupsOutOfOrder(self): |
| 1150 """Multiple unordered groups should maintain external order""" |
| 1151 mock_obj = self.mox.CreateMockAnything() |
| 1152 mock_obj.Method(1).InAnyOrder() |
| 1153 mock_obj.Method(2).InAnyOrder() |
| 1154 mock_obj.Foo().InAnyOrder('group2') |
| 1155 mock_obj.Bar().InAnyOrder('group2') |
| 1156 self.mox.ReplayAll() |
| 1157 |
| 1158 mock_obj.Method(2) |
| 1159 self.assertRaises(mox.UnexpectedMethodCallError, mock_obj.Bar) |
| 1160 |
| 1161 def testUnorderedGroupWithReturnValue(self): |
| 1162 """Unordered groups should work with return values.""" |
| 1163 mock_obj = self.mox.CreateMockAnything() |
| 1164 mock_obj.Open() |
| 1165 mock_obj.Method(1).InAnyOrder().AndReturn(9) |
| 1166 mock_obj.Method(2).InAnyOrder().AndReturn(10) |
| 1167 mock_obj.Close() |
| 1168 self.mox.ReplayAll() |
| 1169 |
| 1170 mock_obj.Open() |
| 1171 actual_two = mock_obj.Method(2) |
| 1172 actual_one = mock_obj.Method(1) |
| 1173 mock_obj.Close() |
| 1174 |
| 1175 self.assertEquals(9, actual_one) |
| 1176 self.assertEquals(10, actual_two) |
| 1177 |
| 1178 self.mox.VerifyAll() |
| 1179 |
| 1180 def testUnorderedGroupWithComparator(self): |
| 1181 """Unordered groups should work with comparators""" |
| 1182 |
| 1183 def VerifyOne(cmd): |
| 1184 if not isinstance(cmd, str): |
| 1185 self.fail('Unexpected type passed to comparator: ' + str(cmd)) |
| 1186 return cmd == 'test' |
| 1187 |
| 1188 def VerifyTwo(cmd): |
| 1189 return True |
| 1190 |
| 1191 mock_obj = self.mox.CreateMockAnything() |
| 1192 mock_obj.Foo(['test'], mox.Func(VerifyOne), bar=1).InAnyOrder().\ |
| 1193 AndReturn('yes test') |
| 1194 mock_obj.Foo(['test'], mox.Func(VerifyTwo), bar=1).InAnyOrder().\ |
| 1195 AndReturn('anything') |
| 1196 |
| 1197 self.mox.ReplayAll() |
| 1198 |
| 1199 mock_obj.Foo(['test'], 'anything', bar=1) |
| 1200 mock_obj.Foo(['test'], 'test', bar=1) |
| 1201 |
| 1202 self.mox.VerifyAll() |
| 1203 |
| 1204 def testMultipleTimes(self): |
| 1205 """Test if MultipleTimesGroup works.""" |
| 1206 mock_obj = self.mox.CreateMockAnything() |
| 1207 mock_obj.Method(1).MultipleTimes().AndReturn(9) |
| 1208 mock_obj.Method(2).AndReturn(10) |
| 1209 mock_obj.Method(3).MultipleTimes().AndReturn(42) |
| 1210 self.mox.ReplayAll() |
| 1211 |
| 1212 actual_one = mock_obj.Method(1) |
| 1213 second_one = mock_obj.Method(1) # This tests MultipleTimes. |
| 1214 actual_two = mock_obj.Method(2) |
| 1215 actual_three = mock_obj.Method(3) |
| 1216 mock_obj.Method(3) |
| 1217 mock_obj.Method(3) |
| 1218 |
| 1219 self.mox.VerifyAll() |
| 1220 |
| 1221 self.assertEquals(9, actual_one) |
| 1222 self.assertEquals(9, second_one) # Repeated calls should return same number. |
| 1223 self.assertEquals(10, actual_two) |
| 1224 self.assertEquals(42, actual_three) |
| 1225 |
| 1226 def testMultipleTimesUsingIsAParameter(self): |
| 1227 """Test if MultipleTimesGroup works with a IsA parameter.""" |
| 1228 mock_obj = self.mox.CreateMockAnything() |
| 1229 mock_obj.Open() |
| 1230 mock_obj.Method(mox.IsA(str)).MultipleTimes("IsA").AndReturn(9) |
| 1231 mock_obj.Close() |
| 1232 self.mox.ReplayAll() |
| 1233 |
| 1234 mock_obj.Open() |
| 1235 actual_one = mock_obj.Method("1") |
| 1236 second_one = mock_obj.Method("2") # This tests MultipleTimes. |
| 1237 mock_obj.Close() |
| 1238 |
| 1239 self.mox.VerifyAll() |
| 1240 |
| 1241 self.assertEquals(9, actual_one) |
| 1242 self.assertEquals(9, second_one) # Repeated calls should return same number. |
| 1243 |
| 1244 def testMutlipleTimesUsingFunc(self): |
| 1245 """Test that the Func is not evaluated more times than necessary. |
| 1246 |
| 1247 If a Func() has side effects, it can cause a passing test to fail. |
| 1248 """ |
| 1249 |
| 1250 self.counter = 0 |
| 1251 def MyFunc(actual_str): |
| 1252 """Increment the counter if actual_str == 'foo'.""" |
| 1253 if actual_str == 'foo': |
| 1254 self.counter += 1 |
| 1255 return True |
| 1256 |
| 1257 mock_obj = self.mox.CreateMockAnything() |
| 1258 mock_obj.Open() |
| 1259 mock_obj.Method(mox.Func(MyFunc)).MultipleTimes() |
| 1260 mock_obj.Close() |
| 1261 self.mox.ReplayAll() |
| 1262 |
| 1263 mock_obj.Open() |
| 1264 mock_obj.Method('foo') |
| 1265 mock_obj.Method('foo') |
| 1266 mock_obj.Method('not-foo') |
| 1267 mock_obj.Close() |
| 1268 |
| 1269 self.mox.VerifyAll() |
| 1270 |
| 1271 self.assertEquals(2, self.counter) |
| 1272 |
| 1273 def testMultipleTimesThreeMethods(self): |
| 1274 """Test if MultipleTimesGroup works with three or more methods.""" |
| 1275 mock_obj = self.mox.CreateMockAnything() |
| 1276 mock_obj.Open() |
| 1277 mock_obj.Method(1).MultipleTimes().AndReturn(9) |
| 1278 mock_obj.Method(2).MultipleTimes().AndReturn(8) |
| 1279 mock_obj.Method(3).MultipleTimes().AndReturn(7) |
| 1280 mock_obj.Method(4).AndReturn(10) |
| 1281 mock_obj.Close() |
| 1282 self.mox.ReplayAll() |
| 1283 |
| 1284 mock_obj.Open() |
| 1285 actual_three = mock_obj.Method(3) |
| 1286 mock_obj.Method(1) |
| 1287 actual_two = mock_obj.Method(2) |
| 1288 mock_obj.Method(3) |
| 1289 actual_one = mock_obj.Method(1) |
| 1290 actual_four = mock_obj.Method(4) |
| 1291 mock_obj.Close() |
| 1292 |
| 1293 self.assertEquals(9, actual_one) |
| 1294 self.assertEquals(8, actual_two) |
| 1295 self.assertEquals(7, actual_three) |
| 1296 self.assertEquals(10, actual_four) |
| 1297 |
| 1298 self.mox.VerifyAll() |
| 1299 |
| 1300 def testMultipleTimesMissingOne(self): |
| 1301 """Test if MultipleTimesGroup fails if one method is missing.""" |
| 1302 mock_obj = self.mox.CreateMockAnything() |
| 1303 mock_obj.Open() |
| 1304 mock_obj.Method(1).MultipleTimes().AndReturn(9) |
| 1305 mock_obj.Method(2).MultipleTimes().AndReturn(8) |
| 1306 mock_obj.Method(3).MultipleTimes().AndReturn(7) |
| 1307 mock_obj.Method(4).AndReturn(10) |
| 1308 mock_obj.Close() |
| 1309 self.mox.ReplayAll() |
| 1310 |
| 1311 mock_obj.Open() |
| 1312 mock_obj.Method(3) |
| 1313 mock_obj.Method(2) |
| 1314 mock_obj.Method(3) |
| 1315 mock_obj.Method(3) |
| 1316 mock_obj.Method(2) |
| 1317 |
| 1318 self.assertRaises(mox.UnexpectedMethodCallError, mock_obj.Method, 4) |
| 1319 |
| 1320 def testMultipleTimesTwoGroups(self): |
| 1321 """Test if MultipleTimesGroup works with a group after a |
| 1322 MultipleTimesGroup. |
| 1323 """ |
| 1324 mock_obj = self.mox.CreateMockAnything() |
| 1325 mock_obj.Open() |
| 1326 mock_obj.Method(1).MultipleTimes().AndReturn(9) |
| 1327 mock_obj.Method(3).MultipleTimes("nr2").AndReturn(42) |
| 1328 mock_obj.Close() |
| 1329 self.mox.ReplayAll() |
| 1330 |
| 1331 mock_obj.Open() |
| 1332 actual_one = mock_obj.Method(1) |
| 1333 mock_obj.Method(1) |
| 1334 actual_three = mock_obj.Method(3) |
| 1335 mock_obj.Method(3) |
| 1336 mock_obj.Close() |
| 1337 |
| 1338 self.assertEquals(9, actual_one) |
| 1339 self.assertEquals(42, actual_three) |
| 1340 |
| 1341 self.mox.VerifyAll() |
| 1342 |
| 1343 def testMultipleTimesTwoGroupsFailure(self): |
| 1344 """Test if MultipleTimesGroup fails with a group after a |
| 1345 MultipleTimesGroup. |
| 1346 """ |
| 1347 mock_obj = self.mox.CreateMockAnything() |
| 1348 mock_obj.Open() |
| 1349 mock_obj.Method(1).MultipleTimes().AndReturn(9) |
| 1350 mock_obj.Method(3).MultipleTimes("nr2").AndReturn(42) |
| 1351 mock_obj.Close() |
| 1352 self.mox.ReplayAll() |
| 1353 |
| 1354 mock_obj.Open() |
| 1355 actual_one = mock_obj.Method(1) |
| 1356 mock_obj.Method(1) |
| 1357 actual_three = mock_obj.Method(3) |
| 1358 |
| 1359 self.assertRaises(mox.UnexpectedMethodCallError, mock_obj.Method, 1) |
| 1360 |
| 1361 def testWithSideEffects(self): |
| 1362 """Test side effect operations actually modify their target objects.""" |
| 1363 def modifier(mutable_list): |
| 1364 mutable_list[0] = 'mutated' |
| 1365 mock_obj = self.mox.CreateMockAnything() |
| 1366 mock_obj.ConfigureInOutParameter(['original']).WithSideEffects(modifier) |
| 1367 mock_obj.WorkWithParameter(['mutated']) |
| 1368 self.mox.ReplayAll() |
| 1369 |
| 1370 local_list = ['original'] |
| 1371 mock_obj.ConfigureInOutParameter(local_list) |
| 1372 mock_obj.WorkWithParameter(local_list) |
| 1373 |
| 1374 self.mox.VerifyAll() |
| 1375 |
| 1376 def testWithSideEffectsException(self): |
| 1377 """Test side effect operations actually modify their target objects.""" |
| 1378 def modifier(mutable_list): |
| 1379 mutable_list[0] = 'mutated' |
| 1380 mock_obj = self.mox.CreateMockAnything() |
| 1381 method = mock_obj.ConfigureInOutParameter(['original']) |
| 1382 method.WithSideEffects(modifier).AndRaise(Exception('exception')) |
| 1383 mock_obj.WorkWithParameter(['mutated']) |
| 1384 self.mox.ReplayAll() |
| 1385 |
| 1386 local_list = ['original'] |
| 1387 self.failUnlessRaises(Exception, |
| 1388 mock_obj.ConfigureInOutParameter, |
| 1389 local_list) |
| 1390 mock_obj.WorkWithParameter(local_list) |
| 1391 |
| 1392 self.mox.VerifyAll() |
| 1393 |
| 1394 def testStubOutMethod(self): |
| 1395 """Test that a method is replaced with a MockAnything.""" |
| 1396 test_obj = TestClass() |
| 1397 # Replace OtherValidCall with a mock. |
| 1398 self.mox.StubOutWithMock(test_obj, 'OtherValidCall') |
| 1399 self.assert_(isinstance(test_obj.OtherValidCall, mox.MockAnything)) |
| 1400 test_obj.OtherValidCall().AndReturn('foo') |
| 1401 self.mox.ReplayAll() |
| 1402 |
| 1403 actual = test_obj.OtherValidCall() |
| 1404 |
| 1405 self.mox.VerifyAll() |
| 1406 self.mox.UnsetStubs() |
| 1407 self.assertEquals('foo', actual) |
| 1408 self.failIf(isinstance(test_obj.OtherValidCall, mox.MockAnything)) |
| 1409 |
| 1410 def testWarnsUserIfMockingMock(self): |
| 1411 """Test that user is warned if they try to stub out a MockAnything.""" |
| 1412 self.mox.StubOutWithMock(TestClass, 'MyStaticMethod') |
| 1413 self.assertRaises(TypeError, self.mox.StubOutWithMock, TestClass, |
| 1414 'MyStaticMethod') |
| 1415 |
| 1416 def testStubOutObject(self): |
| 1417 """Test than object is replaced with a Mock.""" |
| 1418 |
| 1419 class Foo(object): |
| 1420 def __init__(self): |
| 1421 self.obj = TestClass() |
| 1422 |
| 1423 foo = Foo() |
| 1424 self.mox.StubOutWithMock(foo, "obj") |
| 1425 self.assert_(isinstance(foo.obj, mox.MockObject)) |
| 1426 foo.obj.ValidCall() |
| 1427 self.mox.ReplayAll() |
| 1428 |
| 1429 foo.obj.ValidCall() |
| 1430 |
| 1431 self.mox.VerifyAll() |
| 1432 self.mox.UnsetStubs() |
| 1433 self.failIf(isinstance(foo.obj, mox.MockObject)) |
| 1434 |
| 1435 def testForgotReplayHelpfulMessage(self): |
| 1436 """If there is an AttributeError on a MockMethod, give users a helpful msg. |
| 1437 """ |
| 1438 foo = self.mox.CreateMockAnything() |
| 1439 bar = self.mox.CreateMockAnything() |
| 1440 foo.GetBar().AndReturn(bar) |
| 1441 bar.ShowMeTheMoney() |
| 1442 # Forgot to replay! |
| 1443 try: |
| 1444 foo.GetBar().ShowMeTheMoney() |
| 1445 except AttributeError, e: |
| 1446 self.assertEquals('MockMethod has no attribute "ShowMeTheMoney". ' |
| 1447 'Did you remember to put your mocks in replay mode?', str(e)) |
| 1448 |
| 1449 |
| 1450 class ReplayTest(unittest.TestCase): |
| 1451 """Verify Replay works properly.""" |
| 1452 |
| 1453 def testReplay(self): |
| 1454 """Replay should put objects into replay mode.""" |
| 1455 mock_obj = mox.MockObject(TestClass) |
| 1456 self.assertFalse(mock_obj._replay_mode) |
| 1457 mox.Replay(mock_obj) |
| 1458 self.assertTrue(mock_obj._replay_mode) |
| 1459 |
| 1460 |
| 1461 class MoxTestBaseTest(unittest.TestCase): |
| 1462 """Verify that all tests in a class derived from MoxTestBase are wrapped.""" |
| 1463 |
| 1464 def setUp(self): |
| 1465 self.mox = mox.Mox() |
| 1466 self.test_mox = mox.Mox() |
| 1467 self.result = unittest.TestResult() |
| 1468 |
| 1469 def tearDown(self): |
| 1470 # In case one of our tests fail before UnsetStubs is called. |
| 1471 self.mox.UnsetStubs() |
| 1472 self.test_mox.UnsetStubs() |
| 1473 |
| 1474 def _setUpTestClass(self): |
| 1475 """Replacement for setUp in the test class instance. |
| 1476 |
| 1477 Assigns a mox.Mox instance as the mox attribute of the test class instance. |
| 1478 This replacement Mox instance is under our control before setUp is called |
| 1479 in the test class instance. |
| 1480 """ |
| 1481 self.test.mox = self.test_mox |
| 1482 |
| 1483 def _CreateTest(self, test_name): |
| 1484 """Create a test from our example mox class. |
| 1485 |
| 1486 The created test instance is assigned to this instances test attribute. |
| 1487 """ |
| 1488 self.test = mox_test_helper.ExampleMoxTest(test_name) |
| 1489 self.mox.stubs.Set(self.test, 'setUp', self._setUpTestClass) |
| 1490 |
| 1491 def _VerifySuccess(self): |
| 1492 """Run the checks to confirm test method completed successfully.""" |
| 1493 self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs') |
| 1494 self.mox.StubOutWithMock(self.test_mox, 'VerifyAll') |
| 1495 self.test_mox.UnsetStubs() |
| 1496 self.test_mox.VerifyAll() |
| 1497 self.mox.ReplayAll() |
| 1498 self.test.run(result=self.result) |
| 1499 self.assertTrue(self.result.wasSuccessful()) |
| 1500 self.mox.UnsetStubs() |
| 1501 self.mox.VerifyAll() |
| 1502 self.test_mox.UnsetStubs() |
| 1503 self.test_mox.VerifyAll() |
| 1504 |
| 1505 def testSuccess(self): |
| 1506 """Successful test method execution test.""" |
| 1507 self._CreateTest('testSuccess') |
| 1508 self._VerifySuccess() |
| 1509 |
| 1510 def testExpectedNotCalled(self): |
| 1511 """Stubbed out method is not called.""" |
| 1512 self._CreateTest('testExpectedNotCalled') |
| 1513 self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs') |
| 1514 # Dont stub out VerifyAll - that's what causes the test to fail |
| 1515 self.test_mox.UnsetStubs() |
| 1516 self.test_mox.VerifyAll() |
| 1517 self.mox.ReplayAll() |
| 1518 self.test.run(result=self.result) |
| 1519 self.failIf(self.result.wasSuccessful()) |
| 1520 self.mox.UnsetStubs() |
| 1521 self.mox.VerifyAll() |
| 1522 self.test_mox.UnsetStubs() |
| 1523 |
| 1524 def testUnexpectedCall(self): |
| 1525 """Stubbed out method is called with unexpected arguments.""" |
| 1526 self._CreateTest('testUnexpectedCall') |
| 1527 self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs') |
| 1528 # Ensure no calls are made to VerifyAll() |
| 1529 self.mox.StubOutWithMock(self.test_mox, 'VerifyAll') |
| 1530 self.test_mox.UnsetStubs() |
| 1531 self.mox.ReplayAll() |
| 1532 self.test.run(result=self.result) |
| 1533 self.failIf(self.result.wasSuccessful()) |
| 1534 self.mox.UnsetStubs() |
| 1535 self.mox.VerifyAll() |
| 1536 self.test_mox.UnsetStubs() |
| 1537 |
| 1538 def testFailure(self): |
| 1539 """Failing assertion in test method.""" |
| 1540 self._CreateTest('testFailure') |
| 1541 self.mox.StubOutWithMock(self.test_mox, 'UnsetStubs') |
| 1542 # Ensure no calls are made to VerifyAll() |
| 1543 self.mox.StubOutWithMock(self.test_mox, 'VerifyAll') |
| 1544 self.test_mox.UnsetStubs() |
| 1545 self.mox.ReplayAll() |
| 1546 self.test.run(result=self.result) |
| 1547 self.failIf(self.result.wasSuccessful()) |
| 1548 self.mox.UnsetStubs() |
| 1549 self.mox.VerifyAll() |
| 1550 self.test_mox.UnsetStubs() |
| 1551 |
| 1552 def testMixin(self): |
| 1553 """Run test from mix-in test class, ensure it passes.""" |
| 1554 self._CreateTest('testStat') |
| 1555 self._VerifySuccess() |
| 1556 |
| 1557 def testMixinAgain(self): |
| 1558 """Run same test as above but from the current test class. |
| 1559 |
| 1560 This ensures metaclass properly wrapped test methods from all base classes. |
| 1561 If unsetting of stubs doesn't happen, this will fail. |
| 1562 """ |
| 1563 self._CreateTest('testStatOther') |
| 1564 self._VerifySuccess() |
| 1565 |
| 1566 |
| 1567 class VerifyTest(unittest.TestCase): |
| 1568 """Verify Verify works properly.""" |
| 1569 |
| 1570 def testVerify(self): |
| 1571 """Verify should be called for all objects. |
| 1572 |
| 1573 This should throw an exception because the expected behavior did not occur. |
| 1574 """ |
| 1575 mock_obj = mox.MockObject(TestClass) |
| 1576 mock_obj.ValidCall() |
| 1577 mock_obj._Replay() |
| 1578 self.assertRaises(mox.ExpectedMethodCallsError, mox.Verify, mock_obj) |
| 1579 |
| 1580 |
| 1581 class ResetTest(unittest.TestCase): |
| 1582 """Verify Reset works properly.""" |
| 1583 |
| 1584 def testReset(self): |
| 1585 """Should empty all queues and put mocks in record mode.""" |
| 1586 mock_obj = mox.MockObject(TestClass) |
| 1587 mock_obj.ValidCall() |
| 1588 self.assertFalse(mock_obj._replay_mode) |
| 1589 mock_obj._Replay() |
| 1590 self.assertTrue(mock_obj._replay_mode) |
| 1591 self.assertEquals(1, len(mock_obj._expected_calls_queue)) |
| 1592 |
| 1593 mox.Reset(mock_obj) |
| 1594 self.assertFalse(mock_obj._replay_mode) |
| 1595 self.assertEquals(0, len(mock_obj._expected_calls_queue)) |
| 1596 |
| 1597 |
| 1598 class MyTestCase(unittest.TestCase): |
| 1599 """Simulate the use of a fake wrapper around Python's unittest library.""" |
| 1600 |
| 1601 def setUp(self): |
| 1602 super(MyTestCase, self).setUp() |
| 1603 self.critical_variable = 42 |
| 1604 |
| 1605 |
| 1606 class MoxTestBaseMultipleInheritanceTest(mox.MoxTestBase, MyTestCase): |
| 1607 """Test that multiple inheritance can be used with MoxTestBase.""" |
| 1608 |
| 1609 def setUp(self): |
| 1610 super(MoxTestBaseMultipleInheritanceTest, self).setUp() |
| 1611 |
| 1612 def testMultipleInheritance(self): |
| 1613 """Should be able to access members created by all parent setUp().""" |
| 1614 self.assert_(isinstance(self.mox, mox.Mox)) |
| 1615 self.assertEquals(42, self.critical_variable) |
| 1616 |
| 1617 |
| 1618 class TestClass: |
| 1619 """This class is used only for testing the mock framework""" |
| 1620 |
| 1621 SOME_CLASS_VAR = "test_value" |
| 1622 _PROTECTED_CLASS_VAR = "protected value" |
| 1623 |
| 1624 def __init__(self, ivar=None): |
| 1625 self.__ivar = ivar |
| 1626 |
| 1627 def __eq__(self, rhs): |
| 1628 return self.__ivar == rhs |
| 1629 |
| 1630 def __ne__(self, rhs): |
| 1631 return not self.__eq__(rhs) |
| 1632 |
| 1633 def ValidCall(self): |
| 1634 pass |
| 1635 |
| 1636 def OtherValidCall(self): |
| 1637 pass |
| 1638 |
| 1639 def ValidCallWithArgs(self, *args, **kwargs): |
| 1640 pass |
| 1641 |
| 1642 @classmethod |
| 1643 def MyClassMethod(cls): |
| 1644 pass |
| 1645 |
| 1646 @staticmethod |
| 1647 def MyStaticMethod(): |
| 1648 pass |
| 1649 |
| 1650 def _ProtectedCall(self): |
| 1651 pass |
| 1652 |
| 1653 def __PrivateCall(self): |
| 1654 pass |
| 1655 |
| 1656 def __getitem__(self, key): |
| 1657 pass |
| 1658 |
| 1659 def __DoNotMock(self): |
| 1660 pass |
| 1661 |
| 1662 def __getitem__(self, key): |
| 1663 """Return the value for key.""" |
| 1664 return self.d[key] |
| 1665 |
| 1666 def __setitem__(self, key, value): |
| 1667 """Set the value for key to value.""" |
| 1668 self.d[key] = value |
| 1669 |
| 1670 def __contains__(self, key): |
| 1671 """Returns True if d contains the key.""" |
| 1672 return key in self.d |
| 1673 |
| 1674 def __iter__(self): |
| 1675 pass |
| 1676 |
| 1677 class ChildClass(TestClass): |
| 1678 """This inherits from TestClass.""" |
| 1679 def __init__(self): |
| 1680 TestClass.__init__(self) |
| 1681 |
| 1682 def ChildValidCall(self): |
| 1683 pass |
| 1684 |
| 1685 |
| 1686 class CallableClass(object): |
| 1687 """This class is callable, and that should be mockable!""" |
| 1688 |
| 1689 def __init__(self): |
| 1690 pass |
| 1691 |
| 1692 def __call__(self, param): |
| 1693 return param |
| 1694 |
| 1695 |
| 1696 class SubscribtableNonIterableClass(object): |
| 1697 def __getitem__(self, index): |
| 1698 raise IndexError |
| 1699 |
| 1700 |
| 1701 class InheritsFromCallable(CallableClass): |
| 1702 """This class should also be mockable; it inherits from a callable class.""" |
| 1703 |
| 1704 pass |
| 1705 |
| 1706 |
| 1707 if __name__ == '__main__': |
| 1708 unittest.main() |
OLD | NEW |