无论是否包含内容类型,APIClient的POST方法的行为都不同

时间:2019-10-29 06:00:01

标签: django python-3.x django-testing

所以我有这个单元测试:

def test_delete_product(self):
    self.api_client.login(username=self.username, password=self.password)
    path = self.get_url_for_test_against_endpoint('/product/delete/')
    data = {'id': self.product.id}
    response = self.api_client.post(path=path, data=json.dumps(data), content_type='application/json')
    self.assertEqual(response.status_code, 302)
    self.assertFalse(Product.objects.filter(id=self.product.id).exists())

和此视图

def post(self, request):
    pid = request.POST.get('id')
    get_object_or_404(Product, id=pid).delete()
    return redirect('product:products')

我在urls.py中的输入是

path('product/delete/', product_delete_view, name='product_delete') 

我用来调用此视图的AJAX是:

<script>
    const url = "{% url 'product:product_delete' %}"
    var id = "{{ product.id }}"
    var intId = parseInt(id)
    const data = { id: intId, csrfmiddlewaretoken: '{{ csrf_token }}' , contentType:'application/json'}
    $('#{{ product.id }}').click(function () {
        $.post(url, data, function (data, status) {
            console.log(`${data} and status is ${status}`)
            location.reload(true)
        })
    })
</script>

有效方法:

当我通过ajax调用此视图时,一切正常,产品被删除。

什么不起作用

  

现在就可以使用

运行测试时,测试失败,因为response.status_code返回了404
在尝试找出问题所在时,我使用了pdb.set_trace(),发现request.POST.get('id')返回了None
如果我将pid硬编码为1测试用例,这意味着在视图中,它无法从奇怪的请求中获取id,因为它能够执行通过ajax调用也是如此。
如果我使用type(request)pdb.set_trace(),它会说

<class 'django.core.handlers.wsgi.WSGIRequest'>

我可能做错了什么?


更新1

在尝试不同的事物组合时,我解决了问题,但是改变了

response = self.api_client.post(path=path, data=json.dumps(data), content_type='application/json')

response = self.api_client.post(path=path, data=data)

现在我的测试用例工作正常。
但是为什么会发生这种现象?在这两种情况下都将传递密钥,并且应该能够获取它。

0 个答案:

没有答案