Django 2.0 TestCase 为每个测试意外创建模型对象
Django 2.0 TestCase unexpected creation of Model objects for every test
我有一些测试,我需要一个我用 Board.objects.create()
创建的 Board 对象来拥有一个主键 1
的对象。但我发现,每个测试都有一个新对象,所以我有例如 'pk': 5
。如果我添加更多测试,'pk': 5
可能是错误的,因为它变为 'pk': 6
。怎么可能只为所有测试创建一个 'pk': 1
的 Board 对象?
我正在使用 Django 2.0.3
from django.test import TestCase
from django.urls import reverse, resolve
from .views import home, board_topics, new_topic
from .models import Board
class BoardTopicsTests(TestCase):
def setUp(self):
Board.objects.create(name='Django', description='Django board.')
def test_board_topics_view_success_status_code(self):
url = reverse('boards:board_topics', kwargs={'pk': 5})
response = self.client.get(url)
self.assertEquals(response.status_code, 200)
def test_board_topics_view_not_found_status_code(self):
url = reverse('boards:board_topics', kwargs={'pk': 99})
response = self.client.get(url)
self.assertEquals(response.status_code, 404)
def test_board_topics_url_resolves_board_topics_view(self):
view = resolve('/boards/1/')
self.assertEquals(view.func, board_topics)
def test_board_topics_view_link_back_to_homepage(self):
board_topics_url = reverse('boards:board_topics', kwargs={'pk': 3})
response = self.client.get(board_topics_url)
homepage_url = reverse('boards:home')
self.assertContains(response, 'href="{0}"'.format(homepage_url))
def test_board_topics_view_contains_navigation_links(self):
board_topics_url = reverse('boards:board_topics', kwargs={'pk': 2})
homepage_url = reverse('boards:home')
new_topic_url = reverse('boards:new_topic', kwargs={'pk': 2})
response = self.client.get(board_topics_url)
self.assertContains(response, 'href="{0}"'.format(homepage_url))
self.assertContains(response, 'href="{0}"'.format(new_topic_url))
您不应该依赖所创建对象的主键。在这种情况下,您可以将棋盘存储为属性,
def setUp(self):
self.board = Board.objects.create(name='Django', description='Django board.')
然后在测试中使用它的pk。
def test_board_topics_view_success_status_code(self):
url = reverse('boards:board_topics', kwargs={'pk': self.board.pk})
这将使您的测试套件更加健壮。目前,如果您 运行 测试的一个子集,或者 运行 它们的顺序不同,您的测试可能会失败。
我有一些测试,我需要一个我用 Board.objects.create()
创建的 Board 对象来拥有一个主键 1
的对象。但我发现,每个测试都有一个新对象,所以我有例如 'pk': 5
。如果我添加更多测试,'pk': 5
可能是错误的,因为它变为 'pk': 6
。怎么可能只为所有测试创建一个 'pk': 1
的 Board 对象?
我正在使用 Django 2.0.3
from django.test import TestCase
from django.urls import reverse, resolve
from .views import home, board_topics, new_topic
from .models import Board
class BoardTopicsTests(TestCase):
def setUp(self):
Board.objects.create(name='Django', description='Django board.')
def test_board_topics_view_success_status_code(self):
url = reverse('boards:board_topics', kwargs={'pk': 5})
response = self.client.get(url)
self.assertEquals(response.status_code, 200)
def test_board_topics_view_not_found_status_code(self):
url = reverse('boards:board_topics', kwargs={'pk': 99})
response = self.client.get(url)
self.assertEquals(response.status_code, 404)
def test_board_topics_url_resolves_board_topics_view(self):
view = resolve('/boards/1/')
self.assertEquals(view.func, board_topics)
def test_board_topics_view_link_back_to_homepage(self):
board_topics_url = reverse('boards:board_topics', kwargs={'pk': 3})
response = self.client.get(board_topics_url)
homepage_url = reverse('boards:home')
self.assertContains(response, 'href="{0}"'.format(homepage_url))
def test_board_topics_view_contains_navigation_links(self):
board_topics_url = reverse('boards:board_topics', kwargs={'pk': 2})
homepage_url = reverse('boards:home')
new_topic_url = reverse('boards:new_topic', kwargs={'pk': 2})
response = self.client.get(board_topics_url)
self.assertContains(response, 'href="{0}"'.format(homepage_url))
self.assertContains(response, 'href="{0}"'.format(new_topic_url))
您不应该依赖所创建对象的主键。在这种情况下,您可以将棋盘存储为属性,
def setUp(self):
self.board = Board.objects.create(name='Django', description='Django board.')
然后在测试中使用它的pk。
def test_board_topics_view_success_status_code(self):
url = reverse('boards:board_topics', kwargs={'pk': self.board.pk})
这将使您的测试套件更加健壮。目前,如果您 运行 测试的一个子集,或者 运行 它们的顺序不同,您的测试可能会失败。