unittest.mock.seal doesn't work as expected with AsyncMock

hauntsaninja · GitHub

I noticed this while reviewing

#100252 (comment)

I believe the following test case should pass, but it doesn't on main

importunittestfromunittest.mockimportMock, sealclassAsyncClass: asyncdefasync_method(self): passdefnormal_method(self): passclassCase(unittest.TestCase): deftest_spec_normal_methods_on_class_with_mock_seal(self): mock=Mock(AsyncClass) seal(mock) # test passes, aka this raises AttributErrorwithself.assertRaises(AttributeError): mock.normal_method# test fails, aka this does not raise AttributErrorwithself.assertRaises(AttributeError): mock.async_methodunittest.main()It's easy to fix, just need to move the clause that handles AsyncMock after the if self._mock_sealed: check.

cc

@sobolevn

who moved the if self._mock_sealed: check earlier in

https://github.com/python/cpython/pull/28300/files

, but not all the way

Linked PRs

gh-100287: Fix unittest.mock.seal with AsyncMock #100496

[3.11] gh-100287: Fix unittest.mock.seal with AsyncMock (GH-100496) #100506

[3.10] gh-100287: Fix unittest.mock.seal with AsyncMock (GH-100496) #100508