Skip to content

Commit

Permalink
testing: allow to instantiate an empty AsyncTestCase
Browse files Browse the repository at this point in the history
`unittest.TestCase` has a feature where it allows instantiating
`MyTestClass()` with the default method name `runTest` even if a
`runTest` method doesn't actually exist. This is documented in
`TestCase`'s docs under "Changed in version 3.2"[0].

Since version 8.2, pytest relies on this, and started breaking on
Tornado's `AsyncTestCase`[1].

Change `AsyncTestCase` to allow empty instatiation, by matching the
upstream code.

[0] https://docs.python.org/3/library/unittest.html#unittest.TestCase
[1] pytest-dev/pytest#12263
  • Loading branch information
bluetech committed Apr 28, 2024
1 parent f399f40 commit c851aa8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 1 deletion.
9 changes: 9 additions & 0 deletions tornado/test/testing_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,15 @@ def test_subsequent_wait_calls(self):
self.io_loop.add_timeout(self.io_loop.time() + 0.2, self.stop)
self.wait(timeout=0.4)

def test_empty_instantation_is_allowed(self):
"""
Test that empty instatiation of an AsyncTestCase is allowed.
unittest.TestCase docs guarantee this working, and pytest's unittest
support relies on it.
"""
AsyncTestCaseTest()


class LeakTest(AsyncTestCase):
def tearDown(self):
Expand Down
12 changes: 11 additions & 1 deletion tornado/testing.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,17 @@ def __init__(self, methodName: str = "runTest") -> None:
# the test will silently be ignored because nothing will consume
# the generator. Replace the test method with a wrapper that will
# make sure it's not an undecorated generator.
setattr(self, methodName, _TestMethodWrapper(getattr(self, methodName)))
try:
test_method = getattr(self, methodName)
except AttributeError:
if methodName != "runTest":
# We allow instantiation with no explicit method name
# but not an *incorrect* or missing method name.
raise ValueError(
"no such test method in %s: %s" % (self.__class__, methodName)
)
else:
setattr(self, methodName, _TestMethodWrapper(test_method))

# Not used in this class itself, but used by @gen_test
self._test_generator = None # type: Optional[Union[Generator, Coroutine]]
Expand Down

0 comments on commit c851aa8

Please sign in to comment.