Расширение социального конвейера и предотвращение запуска определенной функции во время тестирования
Я использую Python Django Social Auth и расширил конвейер с помощью следующих трех шагов
- Один перед созданием пользователя (partial pipeline), запрашивающий некоторые данные.
- Один для создания пользователя (переопределяет метод
social.pipeline.user.create_user
). - Один после создания пользователя.
Для того чтобы протестировать его, я следую логике, схожей с той, что использована здесь. Вот что у меня есть
@mock.patch("social_core.backends.base.BaseAuth.request")
def test_complete(self, mock_request):
url = reverse("social:complete", kwargs={"backend": "facebook"})
url += "?code=2&state=1"
mock_request.return_value.json.return_value = {"access_token": "123"}
with mock.patch(
"django.contrib.sessions.backends.base.SessionBase" ".set_expiry",
side_effect=[OverflowError, None],
):
response_1 = self.client.get(url)
self.assertEqual(response_1.status_code, 302)
self.assertEqual(response_1.url, "/before-user-is-created/")
response_2 = self.client.post("/before-user-is-created/", {"some_keys": "some_values"})
self.assertEqual(response_2.status_code, 302)
self.assertEqual(response_2.url, "/social-auth/complete/facebook/")
response_3 = self.client.post("/social-auth/complete/facebook/")
return response_3
Для шага 1 у меня есть url (/before-user-is-created/
) и определенное представление. Таким образом, при выполнении response_1 = self.client.get(url)
я получаю это представление и могу действовать в соответствии с ним.
Проблема заключается в шаге 3. Это по сути функция (after_user_creation()
), которая вызывает другую (function_called()
)
def after_user_creation(user, *args, **kwargs):
...
function_called(something_from_user)
Как предотвратить запуск function_called(something_from_user)
во время тестов?
Как предотвратить запуск
function_called(something_from_user)
во время тестирования?
Важно тестировать код контролируемым и последовательным образом, чтобы точно определить его поведение и выявить любые потенциальные проблемы. Изменение поведения кода во время тестирования может поставить под угрозу достоверность и надежность результатов тестирования. Поэтому лучше всего избегать изменения поведения кода во время тестирования, а вместо этого сосредоточиться на создании контролируемой среды для тестирования.
Сказав это, проверьте этот ответ
Вы можете установить патч myapp.file.function_called
как обычно:
with mock.patch(
"django.contrib.sessions.backends.base.SessionBase" ".set_expiry",
side_effect=[OverflowError, None],
), mock.patch("myapp.file.function_called"):
Альтернатива:
@mock.patch("myapp.file.function_called")
@mock.patch("social_core.backends.base.BaseAuth.request")
def test_complete(self, mock_request, mock_function_called):