在另一个工厂的定义中调用时,工厂失败

时间:2013-10-08 23:57:18

标签: database django unit-testing factory django-testing

已解决:此处的示例不准确且未显示问题。解决方案在我下面给出的答案中。


如何从其他应用的单元测试模块中导入工厂,并使用它在此测试模块中创建实例?

我有一个包含多个应用程序的Django项目。单元测试使用Factory Boy来创建模型的实例以进行测试。 (模型由South管理,设置的建议为SOUTH_TESTS_MIGRATE = False。)

在应用bar的单元测试中,我想创建Foo的测试实例,这是在应用foo中定义的模型。

App foo的单元测试模块已经有一个工厂FooFactory,这是我想要使用的工厂:

# foo/tests.py

import factory
…

from . import models

class FooFactory(factory.Factory):
    FACTORY_FOR = models.Foo

    spam = 0
    …

所以在bar,我现在正在编写测试的应用,我需要FooFactory。我尝试导入并使用它:

# bar/tests.py

import factory
…

from . import models
from foo.tests import FooFactory

class BarFactory(factory.Factory):
    FACTORY_FOR = models.Bar

    foo = factory.SubFactory(FooFactory)
    …

class BarTest(TestCase):
    """ Test cases for ‘Bar’ model. """

    def test_frobnicates_to_spanguloid(self):
        """ The instance should frobnicate to a spanguloid. """
        test_foo = FooFactory(code=34)
        test_bar = BarFactory(foo=test_foo)

但测试用例失败,django.db.utils.DatabaseError: no such table: foo_foo尝试创建foo.Foo的实例。

1 个答案:

答案 0 :(得分:0)

问题(在简化示例中没有证明)是在另一家工厂的定义中致电工厂的尝试:

class BarFactory(factory.Factory):
    FACTORY_FOR = models.Bar

    spam = FooFactory(code=34)

失败了django.db.utils.DatabaseError: no such table: foo_foo,因为当Django的测试运行器导入单元测试模块时进行调用。那时,没有一个模型在数据库中。

相反,对工厂的任何调用必须等待测试运行,而不是在定义类时。在这种情况下:

class BarFactory(factory.Factory):
    FACTORY_FOR = models.Bar

    spam = factory.SubFactory(FooFactory)
    …

class BarTestCase(TestCase):

    def setUp(self):
        """ Set up test fixtures. """
        self.test_foo = FooFactory(code=34)

    def test_frobnicates_to_spanguloid(self):
        """ The instance should frobnicate to a spanguloid. """
        test_bar = BarFactory(foo=self.test_foo)