Тестовая проблема Django 2.1

Прежде всего, спасибо за ваше время и извините за мой английский.

Я изучаю Django, у меня было несколько лет разработки на python, и я решил начать проверять этот фреймворк. И я получаю странные ответы. Я пишу TestCase, который отлично работает вне Test.

Это код:

class BoardTopicsTests(TestCase):
    # Hago las acciones necesarias para empezar el test
    def setUp(self):
        self.board = Board(name="Django", description="Django board.")
        # self.board.save()

    # Compruebo el status_code 200
    def test_board_topics_view_status_code(self):
        # self.board.save()
        url = reverse("board_topics", kwargs={"pk":1})
        response = self.client.get(url)
        self.assertEqual(response.status_code, 200)

    # Compruebo el status_code 404
    def test_board_topics_view_not_found_status_code(self):
        url = reverse("board_topics", kwargs={"pk" : 99})
        response = self.client.get(url)
        self.assertEqual(response.status_code, 404)

    # Compruebo que resuelve bien el board
    def test_board_topics_url_resolves_board_topics_views(self):
        view = resolve("/boards/1/")
        self.assertEqual( view.func.__name__, BoardTopics.as_view().__name__ )

Если я сохраняю доску в setUp, метод test_board_topics_view_status_code возвращает 404, если я сохраняю доску внутри метода, он возвращает 200 и проходит тест.

Я думаю, что что-то упустил, потому что я думаю, что он должен работать, сохраняя метод setUp!

Пожалуйста, может кто-нибудь помочь с этим? Это просто для целей обучения, потому что я хочу знать, что там происходит.

Если я печатаю (self.board.id) внутри test_board_topics_view_status_code, он возвращает 1, как и должно быть.

Большое спасибо!


person Miguel A.Romero de los Llanos    schedule 02.12.2018    source источник
comment
Я исследовал немного больше и нашел решение: Если вы хотите настроить данные TEST, вы должны использовать: @classmethod def setUpTestData(cls): #Некоторые действия для хранения данных Метод setUp должен использоваться, например, для входа в систему какого-либо пользователя. В любом случае спасибо за ваше время! :П   -  person Miguel A.Romero de los Llanos    schedule 02.12.2018
comment
Пожалуйста, опубликуйте свой ответ, чтобы другие могли получить пользу.   -  person Daniel    schedule 02.12.2018


Ответы (1)


После небольшого исследования я пришел к решению:

@classmethod
def setUpTestData(cls):
    Board.objects.create(name="Django", description="Django board.")

Вместо:

def setUp(self):
    self.board = Board(name="Django", description="Django board.")
    self.board.save()

Это работает, НО я пытаюсь сделать то же самое с другим классом, и 404 все еще возвращается... В этом конкретном TestCase работает, в других нет, oO

Я немного больше изучаю, я отпишусь, если найду «окончательное» решение, хе-хе-хе.

ОБНОВИТЬ:

Ну в итоге нашел проблему! Решение следующее:

@classmethod
def setUpTestData(cls):
    self.board = Board.objects.create(name="Django", description="Django board.")

# Compruebo el status_code 200
def test_board_topics_view_status_code(self):
    url = reverse("board_topics", kwargs={"pk":self.board.pk})
    response = self.client.get(url)
    self.assertEqual(response.status_code, 200)

Обратите внимание, что в kwargs значение pk равно self.board.pk вместо жестко закодированного 1 (и здесь была ошибка), потому что мы не знаем, будет ли PK равным 1! !! О, эта глупая ошибка отняла у меня одну ночь без сна.

Итак, в конце мы можем возобновить в следующем:

  • Используйте setUpTestData вместо setUp для добавления данных
  • Не нужно жестко кодировать pk, сохраните уже вставленный объект и верните pk

Надеюсь, ответ поможет!

Ваш S3yk0

person Miguel A.Romero de los Llanos    schedule 02.12.2018