【问题标题】:django unit test for delele api is failing due to csrf cookie not set由于未设置 csrf cookie,django 对 delele api 的单元测试失败
【发布时间】:2016-10-09 14:36:30
【问题描述】:

我已经为delete REST API 编写了一个单元测试,但它失败了

{u'detail': u'CSRF Failed: CSRF cookie not set.'}

不知道为什么它检查 CSRF cookie,尽管我在测试用例的顶部设置了 enforce_csrf_checks=True

这是我的测试用例

def setUp(self):
    self.user = Customer.objects.create_user(email="test@gmail.com", password="12345678open", username="tanvir")
    self.requirement_header = RequirementHeader.objects.create_requirement_header(user=self.user)
    self.requirement_header_id = self.requirement_header.id
    self.description = "Description"
    self.file = '/requirements/test_data/test.txt'
    self.requirement_lines = RequirementLine.objects.get_or_create(
        requirement_header=self.requirement_header,
        description=self.description,
        file=self.file,
    )[0]

def test_delete_requirement_line(self):
    client = APIClient(enforce_csrf_checks=True)
    logged_in = client.login(username=self.user.email, password='12345678open')
    if logged_in:
        data = {
            'deleting_user': self.user.email
        }
        response = client.delete('/api/requirements/requirement-line/%d/' % self.requirement_lines.id, data, format='json')
        self.assertEqual(response.status_code, 204)

事实上,这里response.data 返回{u'detail': u'CSRF Failed: CSRF cookie not set.'},这就是为什么状态码是303 并且测试失败的原因。

我的 API 视图:

class RequirementLineRetrieveUpdateDestroyAPIView(BaseRetrieveUpdateDestroyAPIView):

    serializer_class = RequirementLineSerializer
    parser_classes = (MultiPartParser,)

    def delete(self, request, requirement_line_id, *args, **kwargs):
        deleting_user = request.user
        try:
            obj = RequirementService().delete_requirement_line(
                deleting_user=deleting_user,
                requirement_line_id=requirement_line_id,
            )
            return Response(status=status.HTTP_204_NO_CONTENT)
        except ObjectDoesNotExist as e:
            return Response(e.message, status=status.HTTP_404_NOT_FOUND)

我正在使用 Django 1.9 和 DRF 3.x

【问题讨论】:

    标签: django unit-testing cookies django-rest-framework


    【解决方案1】:

    如果你设置了enforce_csrf_checks=True,那么你就是在告诉 Django 实际一个 CSRF 测试。您可能想要做的是在测试期间进行 CSRF 检查。

    Forcing CSRF validation - 默认情况下,使用 APIRequestFactory 创建的请求在传递到 REST 框架视图时不会应用 CSRF 验证。如果需要显式开启 CSRF 验证,可以在实例化工厂时通过设置 enforce_csrf_checks 标志来实现。

    所以,只需删除 enforce_csrf_checks=True,因为默认为 enforce_csrf_checks=False

    【讨论】:

    • 好的,一个问题,只是一个额外的问题,如果我编写单元测试而不进行 csrf 检查可以吗?
    • csrf 检查在测试期间会自动禁用,所以我想说不为它们编写测试是可以的。而django的csrf保护代码本身是django自己测试的。
    猜你喜欢
    • 2013-05-12
    • 2013-11-05
    • 2021-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 2020-12-05
    • 1970-01-01
    • 2013-03-28
    相关资源
    最近更新 更多