0

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


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

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

在 appbar的单元测试中,我想创建Fooapp 中定义的模型的测试实例foo

Appfoo的单元测试模块已经有了 factory FooFactory,也就是我要使用的 factory:

# 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.

4

1 回答 1

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)
于 2013-10-09T00:15:13.853 回答