Я столкнулся с подобной проблемой. Я не мог помешать выполнению тестового метода в базовом классе, но я гарантировал, что он не выполняет никакого реального кода. Я сделал это путем проверки атрибута и немедленного возврата, если он был установлен. Этот атрибут был установлен только для базового класса, и поэтому тесты выполнялись везде, кроме базового класса.
class SharedTest(TestCase):
def setUp(self):
self.do_not_run = True
def test_foo(self):
if getattr(self, 'do_not_run', False):
return
# Rest of the test body.
class OneTestCase(SharedTest):
def setUp(self):
super(OneTestCase, self).setUp()
self.do_not_run = False
Это что-то вроде хака. Существует вероятно лучший способ сделать это , но я не уверен, как .
Обновление
Как сказал Сдолан , миксин - правильный путь. Почему я не видел этого раньше?
Обновление 2
(После прочтения комментариев) Было бы неплохо, если бы (1) метод суперкласса мог избежать хакерской проверки if getattr(self, 'do_not_run', False):
; (2) если количество тестов было подсчитано точно.
Существует возможный способ сделать это. Django подхватывает и выполняет все тестовые классы в tests
, будь то tests.py
или пакет с таким именем. Если тестовый суперкласс объявлен вне тестового модуля, то этого не произойдет. Это все еще может быть унаследовано тестовыми классами. Например, SharedTest
может быть расположен в app.utils
и затем использоваться тестовыми примерами. Это будет более чистая версия вышеуказанного решения.
# module app.utils.test
class SharedTest(TestCase):
def test_foo(self):
# Rest of the test body.
# module app.tests
from app.utils import test
class OneTestCase(test.SharedTest):
...