Издевается или заглушки?

У меня есть метод, который вызывает два других метода в нем.

def main_method(self, query):
  result = self.method_one(query)
  count = self.method_two(result)
  return count

def method_one(self, query):
  #Do some stuff based on results.
  #This method hits the database.
  return result

def method_two(self, result):
  #Do some stuff based on result.
  #This method also hits the database.
  return count

Я не очень опытен в юнит-тестировании и никогда не работал с Mocks и Stubs.

Я не слишком уверен, как создать модульный тест для моего первого метода. Поскольку method_one и method_two попадают в базу данных много раз и они очень дороги, я решил использовать mox для создания макета или заглушки, чтобы устранить необходимость попадания в базу данных.

Я был бы очень признателен, если бы кто-нибудь, имеющий опыт работы с Mocks и Stubs, дал мне несколько советов по использованию mocks и заглушек для моего случая.

1 ответ

Решение

Прежде чем беспокоиться о тестировании main_method()Сначала проверьте меньшие методы. Рассматривать method_one(), С целью обсуждения допустим, что он существует в таком классе:

class Foo(object):
    def method_one(self, query):
        # Big nasty query that hits the database really hard!!
        return query.all()

Чтобы протестировать этот метод без попадания в базу данных, нам нужен объект, который знает, как реагировать на all() метод. Например:

class MockQuery(object):
    def all(self):
        return [1,2]

Теперь мы можем проверить это:

f = Foo()
q = MockQuery()
assert f.method_one(q) == [1,2]

Это основная иллюстрация. Реальный мир часто сложнее. Для того, чтобы написать тест, стоит потрудиться all() скорее всего, сделает что-то более интересное, чем вернуть константу. По аналогии, если method_one() содержит кучу другой логики, наш MockQuery может потребоваться более детальная проработка, то есть способность адекватно реагировать на большее количество методов. Часто, пытаясь протестировать код, вы понимаете, что ваш оригинальный дизайн был перегружен: вам может потребоваться рефакторинг method_one() на более мелкие, более четко определенные - и, следовательно, более проверяемые - части.

Принимая ту же логику на шаг вверх по иерархии, вы можете создать MockFoo класс, который будет знать, как реагировать упрощенными способами method_one() а также method_two(),

Другие вопросы по тегам