我正在這個餐廳應用程式中進行一些單元測驗,當運行“manage.py test”命令時,取消訂單的 API 請求回傳代碼 400,但是在 Postman 上執行相同的請求作業正常(服務器也在我的本地運行使用“manage.py runserver”命令的機器)。我認為這是我在單元測驗中做錯的事情,但我不確定。在設定中,Debug = True 和 ALLOWED_HOSTS = ['*'](但我也嘗試了 ALLOWED_HOSTS = [])。這是代碼:
測驗.py
class CancelOrderAPITest(APITestCase):
def setUp(self):
test_product = Products.objects.create(id=1, name='testProduct', description='-test-', price=2.56)
test_product.save()
test_order = Order.objects.create(table=1, status='WA')
test_order.save()
test_order.product.add(test_product)
self.user = User.objects.create(username='test')
self.user.set_password('passtest')
self.user.save()
Payments.objects.create(value=0.0, user=self.user)
Token.objects.create(user=self.user)
def test_CancelWithCredentials(self):
check_login = self.client.login(username='test', password='passtest')
self.assertTrue(check_login)
token = Token.objects.get_or_create(user=self.user)
self.client.credentials(HTTP_AUTHORIZATION=f'Token {token[0].key}')
data = {"table": 1}
response = self.client.post(reverse('cancel-order'), data=data, content_type='application/json')
order = Order.objects.filter(table=data['table']).order_by('date')[0]
self.assertEqual(response.status_code, status.HTTP_200_OK) # returning 400. Investigate further
self.assertEqual(order.status, Order.Status.CANCELED)
視圖.py
class CancelOrder(APIView):
# REST API view for waiters to cancel orders. The waiter must be an authenticated user
permission_classes = (IsAuthenticated,)
parser_classes = (JSONParser,)
def post(self, request):
data = request.data
try:
order = Order.objects.filter(table=data['table']).order_by('date')[0]
order.status = Order.Status.CANCELED
order.save()
resp = {"status": "Order canceled!"}
except ObjectDoesNotExist:
resp = {"exception": "Couldn't find requested product!"}
return Response(resp)
模型.py
class Order(models.Model):
class Status(models.TextChoices):
WAITING = 'WA', _('Waiting')
DELIVERED = 'DE', _('Delivered')
PARTIAL_DELIVER = 'PD', _('Partially Delivered')
PREPARING = 'PP', _('Preparing')
CANCELED = 'CA', _('Canceled')
PAID = 'PA', _('Paid')
product = models.ManyToManyField(Products)
table = models.IntegerField(default=1)
status = models.CharField(max_length=100, choices=Status.choices, default=Status.WAITING)
date = models.DateTimeField(default=datetime.datetime.now)
payment = models.ForeignKey(Payments, on_delete=models.DO_NOTHING, default=1)
uj5u.com熱心網友回復:
感謝@annonymous 評論,我想通了。由于某種原因,單元測驗在請求中發送資料時使用單引號導致決議錯誤,即使我使用雙引號宣告它也是如此。在發送請求之前添加以下行解決了它:
data = json.dumps(data)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/464459.html
標籤:Python django 单元测试 django-rest-framework
上一篇:我在DjangoRESTFrameworkview.py中修改了response.data。為什么我在測驗期間收到AttributeError,但在實際使用API時卻沒有?
