django тест, дающий ненормальные результаты - PullRequest
0 голосов
/ 09 апреля 2020

Я получаю странные результаты при тестировании двух разных представлений. Они оба списка. Первый должен показывать только активные ордера (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" фактически находится в ответе, Я также напечатал имя пользователя, и оно совпадает.

...