Я получаю странные результаты при тестировании двух разных представлений. Они оба списка. Первый должен показывать только активные ордера (active = True), второй - только исторические c просмотров (завершено = True). Я использую postgresql в качестве базы данных также. Проблема заключается в том, что оба представления отлично работают в браузере, однако при тестировании Pytest выдает ошибку, в которой говорится, что в списке не указан порядок.
Виды следующие:
class OrderHistoryView(LoginRequiredMixin, ListView):
template_name = 'orders/order_history.html'
def get_queryset(self):
user = self.request.user
qs = Order.objects.filter(Q(buyer=user, completed=True)|Q(seller=user, completed=True))
return qs
class OrderListView(LoginRequiredMixin, ListView):
template_name = 'orders/order_list_view.html'
def get_queryset(self):
user = self.request.user
qs = Order.objects.filter(Q(buyer=user, active=True)|Q(seller=user, active=True))
return qs
Тесты:
class OrderHistoryViewTests(TestCase):
@classmethod
def setUp(self):
self.req = RequestFactory()
self.user = mixer.blend('user.CustomUser', email='test@test.com', password='1234')
self.user2 = mixer.blend('user.CustomUser')
self.advert = mixer.blend('advert.Advert', author=self.user)
self.offer = mixer.blend(
'offer.Offer', advert=self.advert, author=self.user2, receiver=self.user, accepted=True)
self.order = mixer.blend(
'orders.Order', advert=self.advert, seller=self.user2, buyer=self.user, offer=self.offer,
pending=True, completed=True, active=True, disputed=False, cancelled=False)
self.order2 = mixer.blend('orders.Order', completed=False, buyer=self.user)
def test_only_shows_completed(self):
request = self.req.get('/')
request.user = self.user
resp = OrderHistoryView.as_view()(request)
self.assertContains(resp, self.order)
self.assertNotContains(resp, order2)
Второй тест точно такой же, он только проверяет, что он показывает только активный orders
Сообщение об ошибке:
FAILED orders/tests/test_views.py::OrderHistoryViewTests::test_only_shows_completed - AssertionError: 3 != 0 : Response should not contain '10'
FAILED orders/tests/test_views.py::OrderListViewTests::test_order_listing_showing_only_active - AssertionError: 2 != 0 : Response should not contain '15'
РЕДАКТИРОВАТЬ: Я провел дополнительное исследование по этому вопросу и обнаружил, что даже первый "self.assertContains (соответственно, self.order)" заявление также не удается. Однако, когда я запускаю test_views, проходит только этот тест "self.assertContains (resp, self.order)", однако, когда я запускаю все тесты вместе, он не проходит. Я заметил после комментирования 5 различных представлений в каталоге test_forms, когда я запускаю тесты, которые они все проходят. Проблема в том, что с 5-ю формами тестов нет ничего плохого, они не являются ложными утверждениями и, кажется, работают срывом.
Затем я поместил оператор печати, чтобы увидеть, какой набор запросов фактически отображается:
при печати Order.objects.all () показывает «,]>», и когда я печатаю (self.order.completed), также появляется значение true. Однако результат неудачного теста говорит: «AssertionError: False не соответствует действительности: не удалось найти« 25 »в ответе», хотя 25 явно есть и завершено. Код представления также выглядит идеально, и представление является очень простым представлением. Что может быть причиной этого?
Также я заметил, что если я запускаю py.test, мне нужно только закомментировать 3 теста формы, и все они пройдут, однако с тестом manage.py я должен закомментировать 5 тестов формы для его прохождения.
Я просто использовал print (resp.context_data), чтобы увидеть, что на самом деле в ответе ...
{'paginator': None, 'page_obj' : Нет, 'is_paginated': False, 'object_list':]>, 'order_list':]>, 'view':}
Отсюда мы видим, что порядок "25" фактически находится в ответе, Я также напечатал имя пользователя, и оно совпадает.