mardi 7 mai 2019

Efficient way to test logs with Django

In my Django files, I make some logging entries pretty simply this way:

# myapp/view.py

import logging

logger = logging.getLogger(__name__)

...
        # somewhere in a method
        logger.warning("display some warning")

Then, suppose I want to test that this warning is logged. In a test suite, I would normally do:

# myapp/test_view.py

...
    # somewhere in a test class
    def test_logger(self):
        with self.assertLogs("myapp.view") as logger:
            # call the view

        self.assertListEqual(logger.output, [
            "WARNING:myapp.view:display some warning"
        ])

This way, the output of the logger is silenced, and I can test it. This works fine when I run tests for this view only with:

./manage.py test myapp.test_view

but not when I run all tests:

./manage.py test

where I get this error:

Traceback (most recent call last):
  File "/home/neraste/myproject/myapp/test_view.py", line 34, in test_logger
    # the call of the view
AssertionError: no logs of level INFO or higher triggered on myapp.view

So, what should I do? I can use unittest.mock.patch to mock the calls to logger but I find this way ugly, especially if you pass arguments to your logger. Moreover, assertLogs is simply designed for that, so I wonder what is wrong.

Aucun commentaire:

Enregistrer un commentaire