工厂男孩工厂的遗传行为错误

时间:2017-07-21 12:35:50

标签: python django factory-boy

我有几家工厂的结构如下:

AbstractFactoryMinimal(DjangoModelFactory):
    comment = ''

AbstractFactoryFull(AbstractFactoryMinimal):
    comment = Faker(provider='text', max_nb_chars=2000)

FactoryMinimal(AbstractFactoryMinimal):
    field = ''

    class Meta(object):
        model = SomeModel

FactoryFull(FactoryMinimal, AbstractFactoryFull):
    field = Faker(provider='text', max_nb_chars=2000)

obj = FactoryFull()
print(obj.comment) # expect some text from faker, but got '' instead
print(obj.field)   # works like expected, return some random text

我有模特

AbstractModel(TimeStampedModel)

SomeModel(AbstractModel)

我甚至看着mro,它看起来就像我期待的那样:

(FactoryFull,
FactoryMinimal,
AbstractFactoryFull,
AbstractFactoryMinimal,
factory.django.DjangoModelFactory,
factory.base.Factory,
factory.base.BaseFactory,
object)

所以"评论"字段应该由faker生成,而不仅仅是设置为''。为什么这样工作?我如何实施工厂以查看预期的行为?

编辑: 我可以在上一个工厂中将继承顺序更改为:

FactoryFull(AbstractFactoryFull, FactoryMinimal)

它会工作但是,如果我想覆盖FactoryMinimal中的字段,它将无法工作。有时我需要这个功能。无论如何,首先在Python中这不是正常的继承行为。

2 个答案:

答案 0 :(得分:2)

所以我找到了一些解决方法。

基本上,我更改了继承顺序并重复了一些代码。像这样:

FactoryMinimal(AbstractFactoryMinimal):
    field = ''

    class Meta(object):
        model = SomeModel

FactoryFull(AbstractFactoryFull, FactoryMinimal):
    field = Faker(provider='text', max_nb_chars=2000)

    class Meta(object):
        model = SomeModel

如果我需要覆盖基类中的某些内容,我可以使用MixIn类:

CommentFieldMixIn(DjangoModelFactory):
    comment = 'Something Completely Different'

FactoryMinimal(AbstractFactoryMinimal):
    field = ''

    class Meta(object):
        model = SomeModel

FactoryFull(CommentFieldMixIn, AbstractFactoryFull, FactoryMinimal):
    field = Faker(provider='text', max_nb_chars=2000)

    class Meta(object):
        model = SomeModel

只剩下一个问题:我怎么能说任何维护我代码的人为什么我会在每个工厂都这样做。

答案 1 :(得分:0)

# Scan the inheritance chain, starting from the furthest point,
# excluding the current class, to retrieve all declarations.
for parent in reversed(self.factory.__mro__[1:]):
    ...

你可以看到上面的原因。同时检查此提交中的测试https://github.com/FactoryBoy/factory_boy/commit/e2ef7c96ed74b35b9dec75a7f222b6ffa9214c10 我怀疑为什么会如此。也许问这个图书馆的作者关于动机?