所以我有这个单元测试:
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'>
我可能做错了什么?
在尝试不同的事物组合时,我解决了问题,但是改变了
response = self.api_client.post(path=path, data=json.dumps(data), content_type='application/json')
到
response = self.api_client.post(path=path, data=data)
现在我的测试用例工作正常。
但是为什么会发生这种现象?在这两种情况下都将传递密钥,并且应该能够获取它。