def test_one_failure(self): a1 = Mock() a1.f = Mock(__name__='f', side_effect=IOError) a1.x = 100 a2 = Mock() a2.f = Mock(__name__='f', return_value=2) a2.x = 200 a = RetryGoRound([a1, a2], lambda ex: isinstance(ex, IOError)) self.assertEqual(a.x, 100) self.assertEqual(a.f(), 2) # a2 was the last alternative that worked, so now we get x from it self.assertEqual(a.x, 200) # this time we should skip calling a1.f() entirely self.assertEqual(a.f(), 2) self.assertEqual(a1.f.call_count, 1) self.assertEqual(a2.f.call_count, 2)
def test_all_fail(self): a1 = Mock() a1.f = Mock(__name__='f', side_effect=IOError) a1.x = 100 a2 = Mock() a2.f = Mock(__name__='f', side_effect=IOError) a2.x = 200 a = RetryGoRound([a1, a2], lambda ex: isinstance(ex, IOError)) self.assertEqual(a.x, 100) # ran out of alternatives self.assertRaises(IOError, a.f) # nothing worked, so we're still pointing at a1 self.assertEqual(a.x, 100) # yep, still broken self.assertRaises(IOError, a.f) self.assertEqual(a1.f.call_count, 2) self.assertEqual(a2.f.call_count, 2)