Расширение социального конвейера и предотвращение запуска определенной функции во время тестирования

Я использую Python Django Social Auth и расширил конвейер с помощью следующих трех шагов

  1. Один перед созданием пользователя (partial pipeline), запрашивающий некоторые данные.
  2. Один для создания пользователя (переопределяет метод social.pipeline.user.create_user).
  3. Один после создания пользователя.

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

@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):
Вернуться на верх