self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
self.assertIn('test1', str(w.warning))
self.assertEqual(w.filename, __file__)
+ self.assertIn("returned 'int'", str(w.warning))
with self.assertWarns(DeprecationWarning) as w:
Test('test2').run()
self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
self.assertIn('test2', str(w.warning))
self.assertEqual(w.filename, __file__)
+ self.assertIn("returned 'async_generator'", str(w.warning))
with self.assertWarns(DeprecationWarning) as w:
Test('test3').run()
self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
self.assertIn('test3', str(w.warning))
self.assertEqual(w.filename, __file__)
+ self.assertIn(f'returned {Nothing.__name__!r}', str(w.warning))
def test_cleanups_interleave_order(self):
events = []
self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
self.assertIn('test1', str(w.warning))
self.assertEqual(w.filename, __file__)
+ self.assertIn("returned 'int'", str(w.warning))
with self.assertWarns(DeprecationWarning) as w:
Foo('test2').run()
self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
self.assertIn('test2', str(w.warning))
self.assertEqual(w.filename, __file__)
+ self.assertIn("returned 'generator'", str(w.warning))
with self.assertWarns(DeprecationWarning) as w:
Foo('test3').run()
self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
self.assertIn('test3', str(w.warning))
self.assertEqual(w.filename, __file__)
+ self.assertIn(f'returned {Nothing.__name__!r}', str(w.warning))
+
+ def test_deprecation_of_return_val_from_test_async_method(self):
+ class Foo(unittest.TestCase):
+ async def test1(self):
+ return 1
+
+ with self.assertWarns(DeprecationWarning) as w:
+ Foo('test1').run()
+ self.assertIn('It is deprecated to return a value that is not None', str(w.warning))
+ self.assertIn('test1', str(w.warning))
+ self.assertEqual(w.filename, __file__)
+ self.assertIn("returned 'coroutine'", str(w.warning))
+ self.assertIn(
+ 'Maybe you forgot to use IsolatedAsyncioTestCase as the base class?',
+ str(w.warning),
+ )
def _check_call_order__subtests(self, result, events, expected_events):
class Foo(Test.LoggingTestCase):
self._callAsync(self.asyncSetUp)
def _callTestMethod(self, method):
- if self._callMaybeAsync(method) is not None:
- warnings.warn(f'It is deprecated to return a value that is not None from a '
- f'test case ({method})', DeprecationWarning, stacklevel=4)
+ result = self._callMaybeAsync(method)
+ if result is not None:
+ msg = (
+ f'It is deprecated to return a value that is not None '
+ f'from a test case ({method} returned {type(result).__name__!r})',
+ )
+ warnings.warn(msg, DeprecationWarning, stacklevel=4)
def _callTearDown(self):
self._callAsync(self.asyncTearDown)
self.setUp()
def _callTestMethod(self, method):
- if method() is not None:
- warnings.warn(f'It is deprecated to return a value that is not None from a '
- f'test case ({method})', DeprecationWarning, stacklevel=3)
+ result = method()
+ if result is not None:
+ import inspect
+ msg = (
+ f'It is deprecated to return a value that is not None '
+ f'from a test case ({method} returned {type(result).__name__!r})'
+ )
+ if inspect.iscoroutine(result):
+ msg += (
+ '. Maybe you forgot to use IsolatedAsyncioTestCase as the base class?'
+ )
+ warnings.warn(msg, DeprecationWarning, stacklevel=3)
def _callTearDown(self):
self.tearDown()
--- /dev/null
+Improve a warning message when a test method in :mod:`unittest` returns
+something other than ``None``. Now we show the returned object type and
+optional asyncio-related tip.