Как пропустить часть кода при тестировании юнитов в Django? - PullRequest
0 голосов
/ 21 сентября 2009

В моем приложении Django есть раздел кода, который загружает файл в Amazon S3, и я хотел бы пропустить этот раздел во время юнит-тестов. Юнит-тесты выполняются с DEBUG=False, поэтому я не могу проверить settings.DEBUG == True, чтобы пропустить этот раздел. Есть идеи?

Ответы [ 3 ]

2 голосов
/ 21 сентября 2009

Вы действительно не хотите «пропустить» код в своих модульных тестах - если вы это сделаете, у вас никогда не будет покрытия для этих областей. Гораздо лучше предоставить фиктивный интерфейс для внешних систем, чтобы вы могли убедиться, что остальная часть кода работает так, как ожидалось. Это особенно важно при работе с внешними ресурсами, которые могут быть недоступны , как S3 может быть в случае проблем с сетью, перерывов в обслуживании или ошибок конфигурации.

В качестве альтернативы, вы можете просто использовать серверную часть хранилища Django S3 в своей производственной среде при настройке тестов для использования локального хранилища файлов.

1 голос
/ 21 сентября 2009

Вы можете - и да, это взломать - импортировать модуль, который выполняет загрузку, и заменить функцию загрузки в этом модуле другой функцией, которая ничего не делает. Примерно так:

foo.py:

def bar():
    return 42

biz.py:

import foo
print foo.bar() # prints 42
foo.bar = lambda: 37
print foo.bar() # prints 37

Опять же, это взлом, но если это единственное место, где вам понадобится такая функциональность, он может работать для вас.

0 голосов
/ 21 сентября 2009

Вы не пропустите функцию для тестирования.

Вы предоставляете фиктивную реализацию для чего-то, что вы не хотите запускать, как если бы это было производство.

Во-первых, вы разрабатываете для тестирования, делая S3 Uploader отдельным классом, который имеет именно тот API, который необходим вашему приложению.

Затем вы пишете фиктивную версию этого класса с тем же API. Все, что он делает, это записывает, что он был назван.

Наконец, вы убедитесь, что ваш тестовый модуль подключается к вашему фиктивному объекту вместо реального S3 Uploader.

В вашем приложении Django не должно быть никаких изменений, кроме изменений, внесенных в него модульным тестом.

Ваш views.py, который выполняет загрузку

import the_uploader
import mock_uploader
from django.conf import settings
uploadClass = eval( settings.S3_UPLOAD_CLASS_NAME )
uploader= uploadClass( ... )

Теперь вы предоставляете два settings.py файла. По умолчанию settings.py имеет правильное имя класса загрузчика.

Для тестирования у вас есть test_settings.py, который выглядит следующим образом.

import settings.py
S3_UPLOAD_CLASS_NAME = "mock_uploader.mock_upload_class"

Это позволяет вам на самом деле проверить все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...