【问题标题】:Extend social pipeline and prevent a specific function to run during tests扩展社交管道并阻止特定功能在测试期间运行
【发布时间】:2023-02-07 04:10:02
【问题描述】:

我正在使用 Python Django Social Auth 并通过以下三个步骤扩展管道

  1. 创建用户之前的一个 (partial pipeline) 请求一些数据。
  2. 一个用于用户创建(覆盖social.pipeline.user.create_user 方法)。
  3. 创建用户后的一个。

    这是 pipeline 目前的样子

    SOCIAL_AUTH_PIPELINE = (
        'social_core.pipeline.social_auth.social_details',
        'social_core.pipeline.social_auth.social_uid',
        'social_core.pipeline.social_auth.social_user',
        'myapp.file.before_user_is_created',
        'myapp.file.create_user',
        'social_core.pipeline.social_auth.associate_user',
        'myapp.file.after_user_creation',
        'social_core.pipeline.social_auth.load_extra_data',
        'social_core.pipeline.user.user_details',
    )
    

    为了测试它,我正在关注similar logic to the one used here。这就是我所拥有的

    @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)
    

    正如您从self.assertEqual(response_1.url, "/before-user-is-created/")response_2 = self.client.post("/before-user-is-created/", {"some_keys": "some_values"}) 中看到的那样。

    问题出在第 3 步。这本质上是一个调用另一个函数 (function_called()) 的函数 (after_user_creation())

    def after_user_creation(user, *args, **kwargs):
        ...
        function_called(something_from_user)
    

    该函数在测试期间在此部分中被调用(连同load_extra_datauser_details(管道中它后面的那些))

    response_2 = self.client.post("/before-user-is-created/", {"some_keys": "some_values"})
    ...
    response_3 = self.client.post("/social-auth/complete/facebook/")
    ...
    

    如何防止function_called(something_from_user)在测试期间运行?

【问题讨论】:

    标签: python django authentication django-testing python-social-auth


    【解决方案1】:

    你可以照常修补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):
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-05
      • 2013-10-28
      相关资源
      最近更新 更多