我有几个工厂的结构是这样的:
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
在我的模型里
^{pr2}$以及
SomeModel(AbstractModel)
我甚至看了一下mro,它看起来和我预期的完全一样:
(FactoryFull,
FactoryMinimal,
AbstractFactoryFull,
AbstractFactoryMinimal,
factory.django.DjangoModelFactory,
factory.base.Factory,
factory.base.BaseFactory,
object)
所以“comment”字段应该由faker生成,而不仅仅是用“”设置。为什么要这样工作?我如何实现工厂以看到预期的行为?在
编辑: 我可以将上一个工厂中的继承顺序更改为:
FactoryFull(AbstractFactoryFull, FactoryMinimal)
它可以工作,但若我想重写FactoryMinimal中的字段,它就不起作用了。有时候我需要这个功能。无论如何,这并不是Python中正常的继承行为。在
你可以看到上面的原因。同时检查此提交中的测试https://github.com/FactoryBoy/factory_boy/commit/e2ef7c96ed74b35b9dec75a7f222b6ffa9214c10 我不知道为什么会这样。也许可以问问这个图书馆的作者关于动机的问题?在
所以我找到了一些解决办法。在
基本上,我改变继承顺序并重复一些代码。像这样:
如果我需要重写基类中的某些内容,我使用MixIn类来实现:
^{pr2}$现在只剩下一个问题:我怎么能说谁会维护我的代码,为什么我要在每个工厂这样做。在
相关问题 更多 >
编程相关推荐