В настоящее время я пытаюсь смоделировать модуль credentials.py, который не существует во время тестов при запуске их с Gitlab Runner в конвейере (учетные данные находятся на .gitignore).Так что на самом деле «макет» должен создать credentials.py.
РЕДАКТИРОВАТЬ: Я полагаю, что проблема заключается в проверке системы django (https://docs.djangoproject.com/en/2.1/ref/checks/),, которая проверяет, все ли импорта доступны.
EDIT2: я нашел способ предотвратить ошибку import_error в тестированииокружающая среда. Но я не уверен, что это попытка выбора в отношении написания хорошего кода, поэтому я не использовал функцию ответа. Я нашел следующий вопрос stackoverflow: Python: макет модуля без импортаон или ему нужно существовать и использовал рекомендацию в первом ответе, чтобы изменить мой код в views.py
:
try:
from battery_upgrade_web import credentials
except ImportError:
from battery_upgrade_web import credentials_example as credentials
credentials_example существует в Gitlab и является пустым. Таким образом, он работает для проведениявсе тесты успешно выполняются в Gitlab Runner.
Мой test_views.py
выглядит следующим образом:
@patch('battery_upgrade_web.views.BatteryUpgradeView.credentials', new=credentials_example)
class IndexViewTest(TestCase):
@patch('battery_upgrade_web.views.BatteryUpgradeView.credentials', new=credentials_example)
def setUp(self):
# A client simulates a user interacting with the code at the view level
# Lot of working mocks
self.c = Client()
@patch('battery_upgrade_web.views.credentials', new=credentials_example)
def test_valid_data(self):
resp = self.c.post('/', data={'parameter': 324})
Мой views.py
:
from battery_upgrade_web import credentials
class BatteryUpgradeView(generic.TemplateView):
def post(self, request, *args, **kwargs):
#lot of code to execute
Моя проблема в том, чтоЯ не могу только пропатчить переменные в credentials.py, но мне нужно пропатчить весь модуль и заменить его на credentials_example.py. Мое решение выше работает локально с существующим credentials.py, оно также высмеиваетcredentials.py и заменяет его на мой credentials_example.py во время тестов.Но когда я удаляю credentials.py, тест выдает следующее сообщение об ошибке при запуске >python web/manage.py test battery_upgrade_web
:
Creating test database for alias 'default'...
Traceback (most recent call last):
File "web/manage.py", line 16, in <module>
execute_from_command_line(sys.argv)
# lot of tracebacks
File "C:\Users\e\AppData\Local\Continuum\anaconda2\envs\BatteryUpgrade36\lib\importlib\__init__.py", line 126, in import_module
return _bootstrap._gcd_import(name[level:], package, level)
File "<frozen importlib._bootstrap>", line 994, in _gcd_import
File "<frozen importlib._bootstrap>", line 971, in _find_and_loal
File "<frozen importlib._bootstrap>", line 955, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 665, in _load_unlocked
File "<frozen importlib._bootstrap_external>", line 678, in exec_module
File "<frozen importlib._bootstrap>", line 219, in _call_with_frames_removed
File "C:\Users\e\Projects\BatteryUpgrade\web\battery_upgrade_web\urls.py", line 21, in <module>
from battery_upgrade_web.views import BatteryUpgradeView
File "C:\Users\e\Projects\BatteryUpgrade\web\battery_upgrade_web\views.py", line 11, in <module>
from battery_upgrade_web import credentials
ImportError: cannot import name 'credentials'
Похоже, что перед тем, как тесты начнутся, происходит импорт модуля.Но как это издеваться?