Макет всего модуля Python для тестовых случаев Django - PullRequest
0 голосов
/ 24 января 2019

В настоящее время я пытаюсь смоделировать модуль 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'

Похоже, что перед тем, как тесты начнутся, происходит импорт модуля.Но как это издеваться?

1 Ответ

0 голосов
/ 24 января 2019

Я могу дать вам направление работы:

def setUp(self):
    model_mocked = MagicMock()
    model_mocked.credentials.return_value = {}
    modules = {'battery_upgrade_web': model_mocked}
    patch.dict('sys.modules', modules).start()

Это создаст MagicMock, добавит объект учетных данных и добавит его в список модулей, которые вы можете импортировать (sys.modules).

Не уверен, что это будет работать для вас, но это способ сделать это.

...