У меня есть класс, подобный следующему:
class A:
def __init__(self, arg1, arg2, arg3):
self.a=arg1
self.b=arg2
self.c=arg3
#...
self.x=do_something(arg1, arg2, arg3)
self.y=do_something(arg1, arg2, arg3)
self.m = self.func1(self.x)
self.n = self.func2(self.y)
#...
def func1(self, arg):
# do something here
def func2(self, arg):
# do something here
Как видите, для инициализации класса необходимо передать arg1, arg2 и arg3. Однако тестирование функций func1 и func2 напрямую не требует таких входных данных, а скорее представляет собой просто логику ввода/вывода.
В моем тесте я, конечно, могу создать и инициализировать тестовый объект обычным способом, а затем протестировать функции func1 и func2 по отдельности. Но для инициализации требуется ввод arg1 arg2, arg3, что на самом деле не имеет отношения к проверке func1 и func2.
Поэтому я хочу протестировать func1 и func2 по отдельности, без предварительного вызова __init__
. Итак, у меня есть следующие 2 вопроса:
__init__
. Я читал из здесь , что A.__new__()
может пропустить вызов __init__
, но при этом создать экземпляр класса. Есть ли лучший способ добиться того, что мне нужно, не делая этого?ПРИМЕЧАНИЕ:
Было 2 вопроса по поводу моего вопроса здесь:
__init__
?Что касается вопроса 1, я провел быстрый поиск в Google и нашел соответствующее исследование или обсуждение по этому вопросу :
We initially test base classes having no parents by designing a test suite that tests each member function individually and also tests the interactions among member functions.
По вопросу 2 я не уверен. Но я думаю, что это необходимо, как показано в примере кода, func1 и func2 вызываются в __init__
. Мне удобнее тестировать их на объекте класса A, который не вызывался с__init__
(и, следовательно, никаких предыдущих вызовов func1 и func2 ).
Конечно, можно просто создать экземпляр объекта класса A с обычными средствами (testobj = A ()), а затем выполнить отдельные тесты для func1 и func2. Но хорошо ли это :)? Я просто обсуждаю здесь, как лучше протестировать такой сценарий, каковы его плюсы и минусы.
С другой стороны, можно возразить, что с точки зрения дизайна НЕ следует помещать вызовы func1 и func2 в __init__
на первое место. Это разумный вариант дизайна?