我有几个工厂,其结构如下:
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 中的正常继承行为。
最佳答案
所以我找到了一些解决方法。
基本上,我更改继承顺序并重复一些代码。像这样:
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
只剩下一个问题:我如何能告诉任何愿意维护我的代码的人为什么我在每个工厂都这样做。
关于python - 工厂男孩工厂中错误的继承行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45237869/