0

Есть тестовая обёртка, она внутри себя использует .assertEquals, который сравнивает два значения. Есть N тестов, которые используют эту обёртку.

def example(actual, expected):
    message = 'not equal!!!111'
    self.assertEquals(actual, expected, message)

example(1, 2)

Я хочу расширить функционал, чтобы стало можно проверять assertIn, но для существующих тестов поведение не поменялось. То есть:

  1. Кортежи, списки и словари передавать как есть
  2. Строки и числа оборачивать в iterable (вероятно, кортеж) из одного элемента. Да, строка - iterable, но я хочу сохранить для строк старое поведение.
  3. Если я захочу передать iterable как единственный элемент, я сам оберну его в кортеж
example(1, 2) # fail
example(1, [1, 2]) #pass
example(1, ([1, 2],)) # fail
example([1, 2], ([1, 2],)) # pass
example('a', 'abc') # fail
example('a', ('a', 'b', 'c')) # pass
example('a', list('abc')) # pass

Пока что я придумал вариант через hasattr:

def example(actual, expected):
    message = 'not equal!!!111'
    if not hasattr(expected, '__iter__'):
        expected = expected,
    self.assertIn(actual, expected, message)

Либо так:

def example(actual, expected):
    message = 'not equal!!!111'
    if hasattr(expected, '__iter__'):
        self.assertIn(actual, expected, message)
    else:
        self.assertEqual(actual, expected, message)

Есть ли слабые места у этого решения? Как сделать лучше/короче? Какое-нибудь волшебное приведение типов вроде !! в JS?

Nick Volynkin
  • 34,094
  • либо проверять на isinstance(theElement, collections.Iterable), больше тут ничего не придумать – FeroxTL Jul 04 '16 at 06:11
  • @FeroxTL похоже на то. Я надеялся, что есть какой-нибудь ещё более простой способ. Придётся самому себе писать ответ ) – Nick Volynkin Jul 04 '16 at 06:22

0 Answers0