diff options
| author | 2020-02-23 20:53:45 +0100 | |
|---|---|---|
| committer | 2020-02-23 21:00:48 +0100 | |
| commit | ea64d7cc6defa759fc1c7f1631a7ae9b8073cc29 (patch) | |
| tree | b531e49532de432978f58588faf301310bd10bcf /tests/test_helpers.py | |
| parent | Remove lingering pytest test_time.py file (diff) | |
Use unittest's AsyncMock instead of our AsyncMock
Python 3.8 introduced an `unittest.mock.AsyncMock` class that can be used to mock coroutines and other types of asynchronous operations like async iterators and async context managers. As we were using our custom, but limited, AsyncMock, I have replaced our mock with unittest's AsyncMock.
Since Python 3.8 also introduces a different way of automatically detecting which attributes should be mocked with an AsyncMock, I've changed our CustomMockMixin to use this new method as well. Together with a couple other small changes, this means that our Custom Mocks now use a lazy method of detecting coroutine attributes, which significantly speeds up the test suite.
Diffstat (limited to '')
| -rw-r--r-- | tests/test_helpers.py | 63 | 
1 files changed, 10 insertions, 53 deletions
| diff --git a/tests/test_helpers.py b/tests/test_helpers.py index fe39df308..81285e009 100644 --- a/tests/test_helpers.py +++ b/tests/test_helpers.py @@ -1,5 +1,4 @@  import asyncio -import inspect  import unittest  import unittest.mock @@ -214,6 +213,11 @@ class DiscordMocksTests(unittest.TestCase):          with self.assertRaises(RuntimeError, msg="cannot reuse already awaited coroutine"):              asyncio.run(coroutine_object) +    def test_user_mock_uses_explicitly_passed_mention_attribute(self): +        """MockUser should use an explicitly passed value for user.mention.""" +        user = helpers.MockUser(mention="hello") +        self.assertEqual(user.mention, "hello") +  class MockObjectTests(unittest.TestCase):      """Tests the mock objects and mixins we've defined.""" @@ -341,57 +345,10 @@ class MockObjectTests(unittest.TestCase):                  attribute = getattr(mock, valid_attribute)                  self.assertTrue(isinstance(attribute, mock_type.child_mock_type)) -    def test_extract_coroutine_methods_from_spec_instance_should_extract_all_and_only_coroutines(self): -        """Test if all coroutine functions are extracted, but not regular methods or attributes.""" -        class CoroutineDonor: -            def __init__(self): -                self.some_attribute = 'alpha' - -            async def first_coroutine(): -                """This coroutine function should be extracted.""" - -            async def second_coroutine(): -                """This coroutine function should be extracted.""" - -            def regular_method(): -                """This regular function should not be extracted.""" - -        class Receiver: +    def test_custom_mock_mixin_mocks_async_magic_methods_with_async_mock(self): +        """The CustomMockMixin should mock async magic methods with an AsyncMock.""" +        class MyMock(helpers.CustomMockMixin, unittest.mock.MagicMock):              pass -        donor = CoroutineDonor() -        receiver = Receiver() - -        helpers.CustomMockMixin._extract_coroutine_methods_from_spec_instance(receiver, donor) - -        self.assertIsInstance(receiver.first_coroutine, helpers.AsyncMock) -        self.assertIsInstance(receiver.second_coroutine, helpers.AsyncMock) -        self.assertFalse(hasattr(receiver, 'regular_method')) -        self.assertFalse(hasattr(receiver, 'some_attribute')) - -    @unittest.mock.patch("builtins.super", new=unittest.mock.MagicMock()) -    @unittest.mock.patch("tests.helpers.CustomMockMixin._extract_coroutine_methods_from_spec_instance") -    def test_custom_mock_mixin_init_with_spec(self, extract_method_mock): -        """Test if CustomMockMixin correctly passes on spec/kwargs and calls the extraction method.""" -        spec_set = "pydis" - -        helpers.CustomMockMixin(spec_set=spec_set) - -        extract_method_mock.assert_called_once_with(spec_set) - -    @unittest.mock.patch("builtins.super", new=unittest.mock.MagicMock()) -    @unittest.mock.patch("tests.helpers.CustomMockMixin._extract_coroutine_methods_from_spec_instance") -    def test_custom_mock_mixin_init_without_spec(self, extract_method_mock): -        """Test if CustomMockMixin correctly passes on spec/kwargs and calls the extraction method.""" -        helpers.CustomMockMixin() - -        extract_method_mock.assert_not_called() - -    def test_async_mock_provides_coroutine_for_dunder_call(self): -        """Test if AsyncMock objects have a coroutine for their __call__ method.""" -        async_mock = helpers.AsyncMock() -        self.assertTrue(inspect.iscoroutinefunction(async_mock.__call__)) - -        coroutine = async_mock() -        self.assertTrue(inspect.iscoroutine(coroutine)) -        self.assertIsNotNone(asyncio.run(coroutine)) +        mock = MyMock() +        self.assertIsInstance(mock.__aenter__, unittest.mock.AsyncMock) | 
