factory_boy提取原始kwargs

时间:2017-06-14 22:08:57

标签: python django factory-boy

我正在建立一个factory_boy工厂,生成一个django模型。我想看看用户输入内联的参数。我的工厂本身看起来像这样

class SomeFactory(factory.django.DjangoModelFactory):

    name = factory.Sequence(lambda n: 'Instance #{}'.format(n))
    some_other_thing = factory.SubFactory(SomeOtherFactory)

    class Meta:
        model = SomeModel

现在用户可以说s = SomeFactory()并且它可以正常工作,但我想检测用户是否输入了自己的参数。例如,告诉用户是否传递了自己的名字,如s = SomeFactory(name='Matt')

我到目前为止所做的是

  • __init__课程中编写自己的SomeFactory函数
    • 这被神秘地覆盖,当我拨打s = SomeFactory()时,我都没有打电话,也没有打电话给s.__init__()
  • 同样可以覆盖__new__方法
  • 覆盖名不见经传的_adjust_kwargs
    • 这为我提供了所有字段kwargs,而不仅仅是用户定义的字段。例如,调用s = SomeFactory(name='Matt'),我会得到一个kwargs dict,其中包含namesome_other_thing的键,这样就无法告诉输入他们自己的参数
  • 覆盖_create
    • 覆盖_adjust_kwargs时仍会遇到同样的问题,因为kwargs并不包含原始kwargs,而是包含所有参数

我认为我之后的许多功能都是factory_boy StepBuilder内的黑盒子(我怀疑它在{{1}中方法)但我不知道如何修改它来做我想做的事。

有没有人想过如何找出instantiate来电中最初设置的kwargs?即确定如果我说s = SomeFactory(),用户手动设置名称?

谢谢!

更新:我正在运行s = SomeFactory(name='Matt')版本django1.11.2版本factory_boy2.8.1版本python

1 个答案:

答案 0 :(得分:2)

您可以覆盖create方法以仅获取用户kwargs。

一个完整的例子是这样的:

from django.contrib.auth.models import User
import factory


class UserFactory(factory.DjangoModelFactory):
    username = factory.Sequence(
        lambda n: 'test'
    )
    email = factory.Sequence(lambda n: 'user{0}@example.com'.format(n))

    class Meta:
        model = User

    @classmethod
    def create(cls, **kwargs):

        # here you'll only have the kwargs that were entered manually

        print(str(kwargs))

        return super(UserFactory, cls).create(**kwargs)

所以当我打电话的时候:

In [2]: UserFactory(username='foobar')
{'username': 'foobar'}
Out[2]: <User: foobar>

如果您希望捕获kwargs以获取除create之外的其他构建策略,则还需要对stubbuild方法执行此操作。