我一直在为Django应用编写单元测试并遇到。由于这个问题,许多测试类都与单个App类相关联。如何通过此应用程序获取单个班级模型。
app = App.objects.create(name='App1',
title='App Test Title',
app_type='F',
abstract='This is a test App',
description='**This is bold text test**',
active=True,
stars=4,
votes=45,
downloads=200,
has_releases=True)
class DevelopmentTestCase(TestCase):
def setUp(self):
Development.objects.create(app=app,
notes='**This is bold text test**')
def test_development_created(self):
development = Development.objects.get(app=app)
self.assertTrue(isinstance(development, Development))
self.assertEqual(development.notes, 'Some test notes')
答案 0 :(得分:2)
您没有发布Development
模型的代码,但我认为它在ForeignyKey
到App
之间。这意味着您在这里 不能可靠地使用Development.objects.get(app=app)
,因为很可能一个app
将拥有许多development
(将有许多与同一个应用程序相关的开发)。因此,解决方案很简单:您必须保留对在Development
中创建的setUp
实例的引用。 FWIW,如果希望测试以适当的隔离工作,则还应该在setUp方法中创建app
实例(并保留对其的引用)。 IOW,您的测试应类似于:
class DevelopmentTestCase(TestCase):
def setUp(self):
self.app = App.objects.create(name='App1',
title='App Test Title',
app_type='F',
abstract='This is a test App',
description='**This is bold text test**',
active=True,
stars=4,
votes=45,
downloads=200,
has_releases=True)
self.development = Development.objects.create(
app=self.app,
notes='**This is bold text test**')
def test_development_created(self):
development = self.development
self.assertTrue(isinstance(development, Development))
self.assertEqual(development.notes, 'Some test notes')
FWIW,您可以(并且应该应该)直接在此处的测试方法中创建开发实例:
class DevelopmentTestCase(TestCase):
def setUp(self):
self.app = App.objects.create(name='App1',
title='App Test Title',
app_type='F',
abstract='This is a test App',
description='**This is bold text test**',
active=True,
stars=4,
votes=45,
downloads=200,
has_releases=True)
def test_development_created(self):
development = Development.objects.create(
app=self.app,
notes='**This is bold text test**')
self.assertTrue(isinstance(development, Development))
self.assertEqual(development.notes, 'Some test notes')
最后测试Development.objects.create()
返回带有提供的值的“开发实例”是没有用的,您可以放心地认为Django模型为“ JustWork(tm)”(并不是说您永远不会在其中找到错误) django,但实际上它们很少见,并且绝对不会涉及诸如创建模型实例之类的基础知识。