factory_boy 工厂的多重继承 - 似乎只继承第一个 parent
Multiple inheritance of factory_boy factories - only seems to inherit the first parent
我试图从两个 ~Factory factory_boy class 继承,但似乎只有第一个 class 被继承,而第二个被忽略。 (他们确实有一个共同点parent。)
class BasicFactory(factory.DjangoModelFactory):
# Meta class, some SubFactories and RelatedFactoriues, a post_generation method
class BasicFactoryWithExtraRelatedFactories(BasicFactory):
another_related = factory.RelatedFactory(SomethingElseFactory, 'basic', etc)
class BasicFactoryWithExtraPostGeneration(BasicFactory):
@factory.post_generation
def post(self, create, extracted, **kwargs):
"""
A replacement post_generation method
"""
class ExtraRelatedAndExtraPostGenerationFactory(BasicFactoryWithExtraRelatedFactories, BasicFactoryWithExtraPostGeneration)
"""
This seems to inherit the extra RelatedFactories, but not the extra post_generation method.
"""
class ExtraRelatedAndExtraPostGenerationFactory(BasicFactoryWithExtraPostGeneration, BasicFactoryWithExtraRelatedFactories)
"""
This seems to inherit the extra post_generation method, but not the extra RelatedFactories.
"""
有什么方法可以继承两者吗?
我知道这是一项艰巨的任务,但它可以为我遇到的问题提供如此美妙的解决方案,这样我就可以简单地通过多重继承创建所有需要的测试用例组合。 (我承认在factory_boy中可能不是'simple'支持的。)
这个方法对我有用,两个final子类都继承了相关工厂和post生成方法,所以我预计实际场景比你上面的测试代码更复杂。这是我的实际代码:
class BasicFactory(factory.DjangoModelFactory):
country = factory.SubFactory(CountryFactory)
code = factory.Sequence(lambda n: 'unit%d' % n)
name = factory.Sequence(lambda n: 'Unit %d' % n)
full_name = factory.Sequence(lambda n: 'Unit %d, etc.' % n)
unit_type = factory.SubFactory(GeographicUnitTypeFactory)
class Meta:
model = 'spatial.GeographicUnit'
class BasicFactoryWithExtraRelatedFactories(BasicFactory):
season = factory.RelatedFactory(SeasonFactory, 'geographicunit')
class BasicFactoryWithExtraPostGeneration(BasicFactory):
@factory.post_generation
def post(self, create, extracted, **kwargs):
"""
A replacement post_generation method
"""
self.name = self.name + ' after post'
class ExtraRelatedAndExtraPostGenerationFactory(BasicFactoryWithExtraRelatedFactories, BasicFactoryWithExtraPostGeneration):
"""
This seems to inherit the extra RelatedFactories, but not the extra post_generation method.
"""
class ExtraPostGenerationAndExtraRelatedFactory(BasicFactoryWithExtraPostGeneration, BasicFactoryWithExtraRelatedFactories):
"""
This seems to inherit the extra post_generation method, but not the extra RelatedFactories.
"""
from django.test import TestCase
class MyTestCase(TestCase):
def test_extrarelated(self):
obj = ExtraRelatedAndExtraPostGenerationFactory()
self.assertTrue(obj.name.endswith(' after post'))
self.assertEqual(Season.objects.filter(geographicunit=obj).count(), 1)
def test_extrapostgeneration(self):
obj = ExtraPostGenerationAndExtraRelatedFactory()
self.assertTrue(obj.name.endswith(' after post'))
self.assertEqual(Season.objects.filter(geographicunit=obj).count(), 1)
结果如下:
./manage.py test --settings=fdw.settings.sqlite spatial.tests.factories:MyTestCase
nosetests spatial.tests.factories:MyTestCase --nocapture --nologcapture --stopwatch-file=.nose-stopwatch-times-sqlite --verbosity=1
Creating test database for alias 'default'...
..
----------------------------------------------------------------------
Ran 2 tests in 0.037s
OK
我试图从两个 ~Factory factory_boy class 继承,但似乎只有第一个 class 被继承,而第二个被忽略。 (他们确实有一个共同点parent。)
class BasicFactory(factory.DjangoModelFactory):
# Meta class, some SubFactories and RelatedFactoriues, a post_generation method
class BasicFactoryWithExtraRelatedFactories(BasicFactory):
another_related = factory.RelatedFactory(SomethingElseFactory, 'basic', etc)
class BasicFactoryWithExtraPostGeneration(BasicFactory):
@factory.post_generation
def post(self, create, extracted, **kwargs):
"""
A replacement post_generation method
"""
class ExtraRelatedAndExtraPostGenerationFactory(BasicFactoryWithExtraRelatedFactories, BasicFactoryWithExtraPostGeneration)
"""
This seems to inherit the extra RelatedFactories, but not the extra post_generation method.
"""
class ExtraRelatedAndExtraPostGenerationFactory(BasicFactoryWithExtraPostGeneration, BasicFactoryWithExtraRelatedFactories)
"""
This seems to inherit the extra post_generation method, but not the extra RelatedFactories.
"""
有什么方法可以继承两者吗?
我知道这是一项艰巨的任务,但它可以为我遇到的问题提供如此美妙的解决方案,这样我就可以简单地通过多重继承创建所有需要的测试用例组合。 (我承认在factory_boy中可能不是'simple'支持的。)
这个方法对我有用,两个final子类都继承了相关工厂和post生成方法,所以我预计实际场景比你上面的测试代码更复杂。这是我的实际代码:
class BasicFactory(factory.DjangoModelFactory):
country = factory.SubFactory(CountryFactory)
code = factory.Sequence(lambda n: 'unit%d' % n)
name = factory.Sequence(lambda n: 'Unit %d' % n)
full_name = factory.Sequence(lambda n: 'Unit %d, etc.' % n)
unit_type = factory.SubFactory(GeographicUnitTypeFactory)
class Meta:
model = 'spatial.GeographicUnit'
class BasicFactoryWithExtraRelatedFactories(BasicFactory):
season = factory.RelatedFactory(SeasonFactory, 'geographicunit')
class BasicFactoryWithExtraPostGeneration(BasicFactory):
@factory.post_generation
def post(self, create, extracted, **kwargs):
"""
A replacement post_generation method
"""
self.name = self.name + ' after post'
class ExtraRelatedAndExtraPostGenerationFactory(BasicFactoryWithExtraRelatedFactories, BasicFactoryWithExtraPostGeneration):
"""
This seems to inherit the extra RelatedFactories, but not the extra post_generation method.
"""
class ExtraPostGenerationAndExtraRelatedFactory(BasicFactoryWithExtraPostGeneration, BasicFactoryWithExtraRelatedFactories):
"""
This seems to inherit the extra post_generation method, but not the extra RelatedFactories.
"""
from django.test import TestCase
class MyTestCase(TestCase):
def test_extrarelated(self):
obj = ExtraRelatedAndExtraPostGenerationFactory()
self.assertTrue(obj.name.endswith(' after post'))
self.assertEqual(Season.objects.filter(geographicunit=obj).count(), 1)
def test_extrapostgeneration(self):
obj = ExtraPostGenerationAndExtraRelatedFactory()
self.assertTrue(obj.name.endswith(' after post'))
self.assertEqual(Season.objects.filter(geographicunit=obj).count(), 1)
结果如下:
./manage.py test --settings=fdw.settings.sqlite spatial.tests.factories:MyTestCase
nosetests spatial.tests.factories:MyTestCase --nocapture --nologcapture --stopwatch-file=.nose-stopwatch-times-sqlite --verbosity=1
Creating test database for alias 'default'...
..
----------------------------------------------------------------------
Ran 2 tests in 0.037s
OK