Ответ Алекса охватывает подход внедрения зависимостей. Другим является фактор вашего метода. В его нынешнем виде он состоит из двух этапов: создание оператора SQL и выполнение оператора SQL. Вы не хотите тестировать второй этап: вы не написали движок SQL или базу данных, вы можете предположить, что они работают правильно. Этап 1 - ваша работа: создание оператора SQL. Таким образом, вы можете реорганизовать код так, чтобы вы могли протестировать только этап 1:
def create_sql(self, opts, args):
#I've left out the error handling.
strtime = datetime.datetime.now().strftime("%D %H:%M")
vals = (strtime, opts.message, opts.keywords, False)
return "insert into mytable values (?, ?, ?, ?)", vals
def create(self, opts, args):
self.execute(*self.create_sql(opts, args))
self.commit()
Функция create_sql
- это фаза 1, и теперь она выражена таким образом, что позволяет вам писать тесты непосредственно против нее: она принимает значения и возвращает значения, поэтому вы можете писать модульные тесты, которые охватывают ее функциональность. Сама функция create
теперь стала проще и не нуждается в таком тщательном тестировании: у вас может быть несколько тестов, которые показывают, что она действительно правильно выполняет SQL, но вам не нужно покрывать все крайние случаи в create
,
Кстати: Это видео от Pycon (Тесты и тестируемость) может быть интересным.