Я думаю, что вы рассмотрели оба варианта.Вы можете подкласс или monkeypatch.Как правило, применение обезьяньего патча, фактически изменение стороннего класса во время выполнения, не одобряется, но в зависимости от того, какие изменения вам нужно внести, это может быть единственным способом обойти ошибку или убедиться, что каждый раз, когда этот класс используется, у него есть новый метод..
Поскольку единственными тестами, в которых используется ваш метод, будет , то ваши тесты monkeypatching не нужны, и вполне разумно подкласс TestCase
.Как правило, вы используете monkeypatching, когда вам нужно расширить метод существующего класса.Например, если вы хотите, чтобы вызовы TestCase.assertEqual
в ваших существующих тестовых примерах были дополнены логикой для сравнения с Option
объектами, вы могли бы monkeypatch TestCase.assertEqual
включить вашу пользовательскую логику плюс ее обычную логику, выполнив что-то вроде:
originalAssertEqual = TestCase.assertEqual
def newAssertEqual(self, first, second):
result = originalAssertEqual(first, second)
if isinstance(first, Option) and isinstance(second, Option):
# do your custom comparison
return result
TestCase.assertEqual = newAssertEqual
Однако, похоже, что по крайней мере в этом примере ненужны и подклассы, и обезьяньи патчи.
Предполагается, что проблема в том, что вызов self.assertEqual(firstOptions, secondOptions)
завершается неудачно, даже если экземпляры Option
равно вам не нужно писать новый assertOptionsEqual
метод.Вам, вероятно, просто нужны ваши объекты Option
, чтобы правильно определить __eq__
.
При условии, что вы получили:
class KnownGoodInputs(TestCase):
def test_good_options(self):
first, second = systemUnderTestGetOptions(...)
self.assertOptionsEqual(first, second)
Какие классы first
и second
выше?
Для всех встроенных типов Python assertEqual
должно работать.Для пользовательского Option
класса просто сделайте что-то вроде этого:
class Опция (объект): def init (self): use_foo = False use_bar = True
def __eq__(self, other):
if (self.use_foo == other.use_foo and
self.use_bar == other.use_bar):
return True
return False
Тогда, предполагая, что first
и second
являются экземплярами Option
, вы можете написать свой тест так же, как:
class KnownGoodInputs(TestCase):
def test_good_options(self):
first, second = systemUnderTestGetOptions(...)
self.assertEqual(first, second)