Инкрементирование PK при добавлении нового TestCase

Я понял, что при добавлении нового TestCase PK в старом TestCase увеличивается. Например, я тестирую метод .get_absolute_url:

def get_absolute_url(self):
  return reverse('linkdetail', kwargs={'pk': self.pk})

с этим тестом

def test_get_absolute_url(self):
  obj = Link.objects.get(title="test_tile")
  self.assertEqual(obj.get_absolute_url(), "/link/1/")

и до этого момента все в порядке и тест проходит, но когда я добавляю еще один TestCase

class LinkCommentTestCase(TestCase):
    def setUp(self):
        user = User.objects.create(username="test",
                                   password="asd")
        link = Link.objects.create(title="test_tile2",
                                   link="http://google.com",
                                   author=user)
        comment = LinkComment.objects.create(author=user,
                                             link=link,
                                             content="asd")

    def test_get_comments_count(self):
        obj = LinkComment.objects.get(content="asd")

я получаю эту ошибку

======================================================================
FAIL: test_get_absolute_url (links.tests.test_models.LinkTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Users/x/Desktop/x/links/tests/test_models.py", line 72, in test_get_absolute_url
    self.assertEqual(obj.get_absolute_url(), "/link/1/")
AssertionError: '/link/2/' != '/link/1/'
- /link/2/
?       ^
+ /link/1/
?  

Почему это происходит и как я могу это предотвратить?

Не указывайте жестко pk, создайте ожидаемый URL динамически.

def test_get_absolute_url(self):
    obj = Link.objects.get(title="test_tile")
    self.assertEqual(obj.get_absolute_url(), f"/link/{obj.pk}/")

Вы не можете быть уверены, что ваш тестовый объект всегда будет получать один и тот же pk

Вы можете проверить результат GET на возвращаемый URL, если не хотите динамически создавать ожидаемый URL

def test_get_absolute_url(self):
    obj = Link.objects.get(title="test_tile")
    response = self.client.get(obj.get_absolute_url())
    self.assertEqual(response.status_code, 200)

    # Test for func based view matched
    self.assertEqual(response.resolver_match.func, link_detail)

    # Test for class based view matched
    self.assertEqual(response.resolver_match.func.__name__, LinkDetail.as_view().__name__)
Вернуться на верх