Pytest, чтобы вставить крепление каплога в методе испытаний - PullRequest
0 голосов
/ 16 мая 2018

У меня есть следующий тестовый класс для pytest:

class TestConnection(AsyncTestCase):
      '''Integration test'''

      @gen_test
      def test_connecting_to_server(self):
          '''Connecting to the TCPserver'''
          client = server = None
          try:
              sock, port = bind_unused_port()
              with NullContext():
                  server = EchoServer()
                  server.add_socket(sock)
              client = IOStream(socket.socket())

              #### HERE I WANT TO HAVE THE caplog FIXTURE

              with ExpectLog(app_log, '.*decode.*'):
                  yield client.connect(('localhost', port))
                  yield client.write(b'hello\n')
                  # yield client.read_until(b'\n')
                  yield gen.moment
                  assert False
          finally:
              if server is not None:
                  server.stop()
              if client is not None:
                  client.close()

Внутри этого класса, видимо, ExpectLog не работает, поэтому после дня копания в документации по pytest я обнаружил, что есть это приспособление каплога, которое вы можетевставил в вас методы для доступа к захваченным журналам.Кажется, это работает, если у меня есть тестовая функция, к которой я добавляю аргумент caplog, но как сделать доступным приспособление caplog в методах тестового класса, подобных приведенному выше?

1 Ответ

0 голосов
/ 16 мая 2018

Хотя вы не можете передавать приборы в качестве параметров unittest методам тестирования, вы можете внедрить их в качестве атрибутов экземпляра. Пример:

# spam.py
import logging

def eggs():
    logging.getLogger().info('bacon')

Тест для spam.eggs():

# test_spam.py
import logging
import unittest
import pytest
import spam


class SpamTest(unittest.TestCase):

    @pytest.fixture(autouse=True)
    def inject_fixtures(self, caplog):
        self._caplog = caplog

    def test_eggs(self):
        with self._caplog.at_level(logging.INFO):
            spam.eggs()
            assert self._caplog.records[0].message == 'bacon'
...