Django测试有问题吗?

t1qtbnec  于 2023-10-21  发布在  Go
关注(0)|答案(1)|浏览(149)

我正在开发一个Django应用程序,目前正在测试它,这是我的观点:

  1. from django.http import JsonResponse, HttpResponseBadRequest
  2. from store.models import Product
  3. from .basket import Basket
  4. # Create your views here.
  5. def basket_summary(request):
  6. basket = Basket(request)
  7. return render(request, "store/basket/summary.html", {"basket": basket})
  8. def basket_add(request):
  9. basket = Basket(request)
  10. if request.POST.get("action") == "post":
  11. product_id = int(request.POST.get("productid"))
  12. product_qty = int(request.POST.get("productqty"))
  13. product = get_object_or_404(Product, id=product_id)
  14. basket.add(product=product, product_qty=product_qty)
  15. basket_qty = basket.__len__()
  16. response = JsonResponse({"qty": basket_qty})
  17. return response
  18. def basket_delete(request):
  19. basket = Basket(request)
  20. if request.POST.get("action") == "post":
  21. product_id = int(request.POST.get("productid"))
  22. basket.delete(product_id=product_id)
  23. basket_qty = basket.__len__()
  24. basket_total = basket.get_total_price()
  25. response = JsonResponse({"qty": basket_qty, "subtotal": basket_total})
  26. return response
  27. def basket_update(request):
  28. basket = Basket(request)
  29. if request.POST.get("action") == "post":
  30. product_id = int(request.POST.get("productid"))
  31. product_qty = int(request.POST.get("productqty"))
  32. basket.update(product_id=product_id, product_qty=product_qty)
  33. basket_qty = basket.__len__()
  34. basket_total = basket.get_total_price()
  35. response = JsonResponse({"qty": basket_qty, "subtotal": basket_total})
  36. return response

我的urls.py文件也在下面:

  1. from .views import basket_summary, basket_add, basket_delete, basket_update
  2. app_name = "store_basket"
  3. urlpatterns = [
  4. path("", basket_summary, name="basket_summary"),
  5. path("add/", basket_add, name="basket_add"),
  6. path("delete/", basket_delete, name="basket_delete"),
  7. path("update/", basket_update, name="basket_update"),
  8. ]

最后是我的测试文件:

  1. from django.contrib.auth.models import User
  2. from django.test import TestCase
  3. from django.urls import reverse
  4. from store.models import Category, Product
  5. from json import loads
  6. class TestBasketView(TestCase):
  7. def setUp(self):
  8. category = Category.objects.create(name="django", slug="django")
  9. user = User.objects.create(username="admin")
  10. Product.objects.create(
  11. title="django beginners",
  12. category=category,
  13. created_by=user,
  14. slug="django-beginners",
  15. price="20.00",
  16. image="django",
  17. )
  18. Product.objects.create(
  19. title="django intermediate",
  20. category=category,
  21. created_by=user,
  22. slug="django-beginners",
  23. price="20.00",
  24. image="django",
  25. )
  26. Product.objects.create(
  27. title="django advanced",
  28. category=category,
  29. created_by=user,
  30. slug="django-beginners",
  31. price="20.00",
  32. image="django",
  33. )
  34. self.client.post(
  35. reverse("store_basket:basket_add"),
  36. {"productid": 1, "productqty": 1, "action": "post"},
  37. xhr=True,
  38. )
  39. self.client.post(
  40. reverse("store_basket:basket_add"),
  41. {"productid": 2, "productqty": 2, "action": "post"},
  42. xhr=True,
  43. )
  44. def test_basket_url(self):
  45. """
  46. Test homepage response status
  47. """
  48. response = self.client.get(reverse("store_basket:basket_summary"))
  49. self.assertEqual(response.status_code, 200)
  50. def test_basket_add(self):
  51. """
  52. Test adding items to the basket
  53. """
  54. response = self.client.post(
  55. reverse("store_basket:basket_add"),
  56. {"productid": 3, "productqty": 1, "action": "post"},
  57. xhr=True,
  58. )
  59. self.assertEqual(response.json(), {"qty": 4})
  60. response = self.client.post(
  61. reverse("store_basket:basket_add"),
  62. {"productid": 2, "productqty": 1, "action": "post"},
  63. xhr=True,
  64. )
  65. self.assertEqual(response.json(), {"qty": 3})
  66. def test_basket_delete(self):
  67. """
  68. Test deleting items from the basket
  69. """
  70. response = self.client.post(
  71. reverse("store_basket:basket_delete"),
  72. {"productid": 2, "action": "post"},
  73. xhr=True,
  74. )
  75. self.assertEqual(response.json(), {"qty": 1, "subtotal": "20.00"})
  76. def test_basket_update(self):
  77. """
  78. Test updating items from the basket
  79. """
  80. response = self.client.post(
  81. reverse("store_basket:basket_update"),
  82. {"productid": 2, "productqty": 1, "action": "post"},
  83. xhr=True,
  84. )
  85. self.assertEqual(response.json(), {"qty": 2, "subtotal": "40.00"})

但是我运行了测试,得到了这个错误:

  1. ======================================================================
  2. ERROR: test_basket_add (store_basket.test.test_views.TestBasketView.test_basket_add)
  3. Test adding items to the basket
  4. ----------------------------------------------------------------------
  5. Traceback (most recent call last):
  6. File "/Users/bottgabriel/Desktop/Practices/py/ecommerce/store_basket/test/test_views.py", line 63, in test_basket_add
  7. self.assertEqual(response.json(), {"qty": 4})
  8. ^^^^^^^^^^^^^^^
  9. File "/Users/bottgabriel/Desktop/Practices/py/ecommerce/venv/lib/python3.11/site-packages/django/test/client.py", line 823, in _parse_json
  10. raise ValueError(
  11. ValueError: Content-Type header is "text/html; charset=utf-8", not "application/json"
  12. ======================================================================
  13. FAIL: test_basket_delete (store_basket.test.test_views.TestBasketView.test_basket_delete)
  14. Test deleting items from the basket
  15. ----------------------------------------------------------------------
  16. Traceback (most recent call last):
  17. File "/Users/bottgabriel/Desktop/Practices/py/ecommerce/store_basket/test/test_views.py", line 80, in test_basket_delete
  18. self.assertEqual(response.json(), {"qty": 1, "subtotal": "20.00"})
  19. AssertionError: {'qty': 0, 'subtotal': 0} != {'qty': 1, 'subtotal': '20.00'}
  20. - {'qty': 0, 'subtotal': 0}
  21. ? ^
  22. + {'qty': 1, 'subtotal': '20.00'}
  23. ? ^ ++ ++++
  24. ======================================================================
  25. FAIL: test_basket_update (store_basket.test.test_views.TestBasketView.test_basket_update)
  26. Test updating items from the basket
  27. ----------------------------------------------------------------------
  28. Traceback (most recent call last):
  29. File "/Users/bottgabriel/Desktop/Practices/py/ecommerce/store_basket/test/test_views.py", line 91, in test_basket_update
  30. self.assertEqual(response.json(), {"qty": 2, "subtotal": "40.00"})
  31. AssertionError: {'qty': 0, 'subtotal': 0} != {'qty': 2, 'subtotal': '40.00'}
  32. - {'qty': 0, 'subtotal': 0}
  33. ? ^
  34. + {'qty': 2, 'subtotal': '40.00'}
  35. ? ^ ++ ++++
  36. ----------------------------------------------------------------------
  37. Ran 13 tests in 0.267s
  38. FAILED (failures=2, errors=1, skipped=1)
  39. Destroying test database for alias 'default'...

任何帮助将不胜感激!
P.S:我已经调试并确保视图返回JSON,但由于某种原因,测试不起作用。

3phpmpom

3phpmpom1#

最有可能的情况是视图引发了一个错误,例如,因为产品不存在,中间件将其转换为HTML页面。
一个常见的误解是主键是固定的。他们不是。你应该把它们存储在测试用例中,所以:

  1. class TestBasketView(TestCase):
  2. def setUp(self):
  3. category = Category.objects.create(name='django', slug='django')
  4. user = User.objects.create(username='admin')
  5. self.product1 = Product.objects.create(
  6. title='django beginners',
  7. category=category,
  8. created_by=user,
  9. slug='django-beginners',
  10. price='20.00',
  11. image='django',
  12. )
  13. self.product2 = Product.objects.create(
  14. title='django intermediate',
  15. category=category,
  16. created_by=user,
  17. slug='django-beginners',
  18. price='20.00',
  19. image='django',
  20. )
  21. self.product3 = Product.objects.create(
  22. title='django advanced',
  23. category=category,
  24. created_by=user,
  25. slug='django-beginners',
  26. price='20.00',
  27. image='django',
  28. )
  29. self.client.post(
  30. reverse('store_basket:basket_add'),
  31. {'productid': self.product1.pk, 'productqty': 1, 'action': 'post'},
  32. xhr=True,
  33. )
  34. self.client.post(
  35. reverse('store_basket:basket_add'),
  36. {'productid': self.product1.pk, 'productqty': 2, 'action': 'post'},
  37. xhr=True,
  38. )
  39. def test_basket_add(self):
  40. """
  41. Test adding items to the basket
  42. """
  43. response = self.client.post(
  44. reverse('store_basket:basket_add'),
  45. {'productid': self.product3.pk, 'productqty': 1, 'action': 'post'},
  46. xhr=True,
  47. )
  48. self.assertEqual(response.json(), {'qty': 4})
  49. response = self.client.post(
  50. reverse('store_basket:basket_add'),
  51. {'productid': self.product2.pk, 'productqty': 1, 'action': 'post'},
  52. xhr=True,
  53. )
  54. self.assertEqual(response.json(), {'qty': 3})

注意:通常情况下,我们 * 不 * 应该调用像__len__这样的魔法属性,通常情况下,这应该只在某些情况下进行,例如在使用super调用时。

展开查看全部

相关问题