如何通过另一个模型发出获取模型请求?

时间:2018-11-06 11:26:46

标签: python django

我一直在为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')

1 个答案:

答案 0 :(得分:2)

您没有发布Development模型的代码,但我认为它在ForeignyKeyApp之间。这意味着您在这里 不能可靠地使用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,但实际上它们很少见,并且绝对不会涉及诸如创建模型实例之类的基础知识。