Очень непонятно, как вы ожидаете, что это будет работать, но, похоже, вы, по крайней мере, несколько озадачены поведением модулей в Python.
Оператор import
(иногда) загружает модуль изисходный файл, а затем привязывает имя в локальной области видимости к этому объекту модуля.
Итак, когда вы делаете:
from twisted.trial import unittest
Вы загружаете модуль twisted.trial.unittest
и затем привязываетелокальное имя unittest
it.
Это не очень интересно взаимодействует со следующим оператором:
from unittest import TestCase
, который загружает модуль unittest
и затем привязывает локальное имя TestCase
кобъект, на который ссылается атрибут TestCase
этого модуля.
Когда вы позже подклассом TestCase
:
class Feature(TestCase):
...
, вы прямо используете имя TestCase
в своем локальномscope - имя, которое ссылается на класс TestCase
, определенный модулем unittest
.Обратите внимание, что он не имеет ничего общего с модулем Twisted twisted.trial.unittest
, даже если вы загрузили этот модуль тоже.Вы должны использовать один из его атрибутов, чтобы использовать его функциональность.
Чтобы изменить поведение вашего кода, нужно просто прекратить вообще использовать стандартный модуль библиотеки unittest
.Удалите эту строку:
from unittest import TestCase
И замените определение вашего класса на:
class Feature(unittest.TestCase):
Не смущайтесь тем, что модуль стандартной библиотеки unittest
разделяет часть именимодуля Twisted twisted.trial.unittest
.Это разные модули с разными (хотя и похожими, иногда перекрывающимися) функциями.Определение класса в приведенном выше примере использует twisted.trial.unittest
, потому что оно идет после исходной строки:
from twisted.trial import unittest
Как только вы фактически используете Twisted TestCase
(из twisted.trial.unittest
), а не стандартную библиотекуTestCase
(из unittest
), вы получите ожидаемое поведение, когда тестовый метод вернет Deferred
.Это связано с тем, что Twisted предоставляет эту функцию, а не стандартную библиотеку.