已解决:此处的示例不准确且未显示问题。解决方案在我下面给出的答案中。
如何从其他应用的单元测试模块中导入工厂,并使用它在此测试模块中创建实例?
我有一个包含多个应用程序的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
的实例。
答案 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)