Некоторые из моих тестов не работают нормально, если я делаю это с Docker в Django Rest Framework - PullRequest
0 голосов
/ 05 апреля 2020

Я разрабатывал проект без Docker, и я интегрировал его, и чтобы убедиться, что все в порядке, я запустил свои тесты. Это шокировало меня, почти половина моих тестов не проходит нормально. Большинство из них тестируют подробные API-представления. Я выложу коды ниже. Пожалуйста, дайте знать, если вы можете найти что-то пропущенное или скрытое))

[Это пример проекта]

models.py

class Book(models.Model):
    name = models.CharField(max_length=255)
    author = models.CharField(max_length=255)
    created_at = models.DateField(auto_now_add=True)

    def __str__(self):
        return self.name

serialisers.py

class BookSerializers(ModelSerializer):
    class Meta:
        model = Book
        fields = ('id', 'name', 'author')

views.py

class BookListApiView(ListAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    permission_classes = [AllowAny, ]


class BookCreateApiView(CreateAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    permission_classes = [AllowAny, ]


class BookRetrieveUpdateDeleteView(RetrieveUpdateDestroyAPIView):
    queryset = Book.objects.all()
    serializer_class = BookSerializers
    permission_classes = [AllowAny, ]

tests.py

LIST_BOOK_API_URL = reverse('book:list')
CREATE_BOOK_API_URL = reverse('book:create')
DETAIL_BOOK_API_URL = reverse('book:detail', kwargs={'pk': 1})

class TestBookApiView(TestCase):
    def setUp(self):
        self.client = APIClient()

    def test_create_book_through_api(self):
        payload = {
            'name': 'this is book',
            'author': 'test author'
        }
        res = self.client.post(CREATE_BOOK_API_URL, payload)
        self.assertEqual(res.status_code, status.HTTP_201_CREATED)

    def test_listing_book_through_api(self):
        Book.objects.create(
            name='test',
            author='testing',
        )
        res = self.client.get(LIST_BOOK_API_URL)
        self.assertEqual(res.status_code, status.HTTP_200_OK)
        self.assertContains(res, 'test')

    def test_retreiving_book_through_api(self):
        Book.objects.create(
            name='test',
            author='testing',
        )
        res = self.client.get(DETAIL_BOOK_API_URL)
        print(DETAIL_BOOK_API_URL)
        self.assertEqual(res.status_code, status.HTTP_200_OK)

urls.py [для приложения книги]

app_name = 'book'

urlpatterns = [
    path('list/', BookListApiView.as_view(), name='list'),
    path('create/', BookCreateApiView.as_view(), name='create'),
    path('<int:pk>/', BookRetrieveUpdateDeleteView.as_view(), name='detail'),
]

urls. py [main]

urlpatterns = [
    path('admin/', admin.site.urls),
    path('book/', include('book.urls')),
]

результаты теста

..F
======================================================================
FAIL: test_retreiving_book_through_api (book.tests.TestBookApiView)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/user/web/book/tests.py", line 39, in test_retreiving_book_through_api
    self.assertEqual(res.status_code, status.HTTP_200_OK)
AssertionError: 404 != 200

----------------------------------------------------------------------
Ran 3 tests in 0.040s

FAILED (failures=1)

my Dockerfile

# the base image for the python that we are using for the project
FROM python:3.8.1-alpine

ENV PYHTONUNBUFFERED 1
ENV PYTHONDONTWRITEBYTECODE 1

# creating a folder.
RUN mkdir -p /home/user

ENV HOME=/home/user
ENV APP_HOME=/home/user/web

WORKDIR ${APP_HOME}

RUN mkdir ${APP_HOME}/staticfiles
RUN mkdir ${APP_HOME}/media

RUN apk update \
    && apk add postgresql-dev gcc python3-dev musl-dev

RUN apk add zlib zlib-dev jpeg-dev

RUN pip install --upgrade pip

COPY ./requirements.txt ${APP_HOME}/requirements.txt

RUN pip install -r requirements.txt
COPY entrypoint.sh ${APP_HOME}/entrypoint.sh

COPY . ${APP_HOME}

RUN adduser -D user
USER user

ENTRYPOINT [ "/home/user/web/entrypoint.sh" ]

Я почти на 100% уверен, что объект создан и эта функция работает. Поскольку я проверил его в браузере, он отлично работает. И если я проверю, это работает без Docker. Пожалуйста, дайте мне знать, что мне не хватает, чтобы пройти тесты.

1 Ответ

2 голосов
/ 05 апреля 2020

Вы жестко запрограммировали DETAIL_BOOK_API_URL для использования идентификатора 1, но может случиться, что в книге нет этого идентификатора. Вы должны использовать идентификатор только что созданной книги

def test_retreiving_book_through_api(self):
    book = Book.objects.create(
        name='test',
        author='testing',
    )
    res = self.client.get(reverse('book:detail', kwargs={'pk': book.pk}))
    self.assertEqual(res.status_code, status.HTTP_200_OK)
...