我有几家工厂的结构如下:
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中这不是正常的继承行为。
答案 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 我怀疑为什么会如此。也许问这个图书馆的作者关于动机?