Как использовать assertRaises в пробном тестовом примере с использованием inlineCallbacks - PullRequest
11 голосов
/ 23 марта 2012

Я пытаюсь выяснить, как написать пробный тест, в котором утверждается, что возникло исключение.

В настоящее время у меня есть 2 простых метода тестирования (успех и неудача). Каждый метод возвращает отложенный метод, который уже был callback'd или errback'd. Тестирование метода успеха работает нормально. При тестировании метода сбоя я ожидаю, что смогу утверждать, что возникла исключительная ситуация (используя assertRaises).

Однако тест не проходит, и я получаю:

twisted.trial.unittest.FailTest: ConnectionRefusedError not raised (<Deferred at 0x920e28c current result: <twisted.python.failure.Failure <class 'twisted.internet.error.ConnectionRefusedError'>>> returned)

Код выглядит следующим образом:

from twisted.trial.unittest import TestCase
from twisted.internet.defer import inlineCallbacks, succeed, fail
from twisted.internet.error import ConnectionRefusedError

class MyObject:
    def success(self):
        return succeed(True)

    def failure(self):
        return fail(ConnectionRefusedError())


class TestErrBack(TestCase):
    def setUp(self):
        self.o = MyObject()

    @inlineCallbacks
    def test_success(self):
        result = yield self.o.success()
        self.assertTrue(result)

    @inlineCallbacks
    def test_failure(self):
        # this test case is failing !
        yield self.assertRaises(ConnectionRefusedError, self.o.failure)

Использую ли я правильный подход в test_failure? Я могу использовать try ... ловить вызов self.o.failure, но я не думаю, что этот подход так же хорош, как использование assertRaises.

1 Ответ

13 голосов
/ 24 марта 2012

Используйте TestCase.assertFailure вместо:

yield self.assertFailure(self.o.failure(), ConnectionRefusedError)

Начиная с Twisted 12.3, есть также TestCase.failureResultOf помощник:

self.failureResultOf(self.o.failure()).trap(ConnectionRefusedError)

И начиная с 13.1, этот API принимает дополнительный аргумент и выполняет проверку типов:

self.failureResultOf(self.o.failure(), ConnectionRefusedError)

Это полезно для тестов, в которых вы знаете, , что Deferred уже дал результат. Если Deferred не имеет результата сбоя во время вызова, failureResultOf вызывает исключение из-за сбоя теста вместо возврата сбоя.

Это будет хорошо работать для вашего примера кода и должно быть применимо к большинству модульных тестов. Если вы используете пробную версию для написания функциональных или интеграционных тестов, где выполняется настоящая асинхронная работа, и вы не знаете, когда сработает Deferred, вам нужно придерживаться первого API, assertFailure.

...