factory_boy 提取原始 kwargs
factory_boy extract original kwargs
我正在用 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')
到目前为止我试过的是
- 在
SomeFactory
class 中编写我自己的 __init__
函数
- 这被神秘地覆盖了,当我调用
s = SomeFactory()
时既没有被调用,也没有当我调用 s.__init__()
时被调用
- 同样适用于覆盖
__new__
方法
- 覆盖命名不当的
_adjust_kwargs
- 这为我提供了
kwargs
的所有字段,而不仅仅是用户定义的字段。例如,调用 s = SomeFactory(name='Matt')
,我会得到一个带有 name
和 some_other_thing
键的 kwargs
字典,这使得无法判断输入是否有自己的参数
- 覆盖
_create
- 在覆盖
_adjust_kwargs
时仍然遇到相同的问题,因为 kwargs
不包含原始 kwargs
,而是包含所有参数
我认为我想要的很多功能在 factory_boy
的 StepBuilder
中被黑盒化了(我怀疑它在 instantiate
方法中)但是我有不知道如何修改它来做我想做的事。
有没有人想过如何找出 s = SomeFactory()
的调用中最初设置了哪些 kwargs
? IE。确定如果我说s = SomeFactory(name='Matt')
,那是用户手动设置的名字?
谢谢!
更新:我是 运行 django
版本 1.11.2
、factory_boy
版本 2.8.1
和 python
版本 3.5.2
您可以覆盖 create
方法以仅获取用户关键字。
一个完整的例子是这样的:
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>
如果您想为 create
以外的其他构建策略捕获 kwargs,您还需要为 stub
和 build
方法执行此操作。
我正在用 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')
到目前为止我试过的是
- 在
SomeFactory
class 中编写我自己的__init__
函数- 这被神秘地覆盖了,当我调用
s = SomeFactory()
时既没有被调用,也没有当我调用s.__init__()
时被调用
- 这被神秘地覆盖了,当我调用
- 同样适用于覆盖
__new__
方法 - 覆盖命名不当的
_adjust_kwargs
- 这为我提供了
kwargs
的所有字段,而不仅仅是用户定义的字段。例如,调用s = SomeFactory(name='Matt')
,我会得到一个带有name
和some_other_thing
键的kwargs
字典,这使得无法判断输入是否有自己的参数
- 这为我提供了
- 覆盖
_create
- 在覆盖
_adjust_kwargs
时仍然遇到相同的问题,因为kwargs
不包含原始kwargs
,而是包含所有参数
- 在覆盖
我认为我想要的很多功能在 factory_boy
的 StepBuilder
中被黑盒化了(我怀疑它在 instantiate
方法中)但是我有不知道如何修改它来做我想做的事。
有没有人想过如何找出 s = SomeFactory()
的调用中最初设置了哪些 kwargs
? IE。确定如果我说s = SomeFactory(name='Matt')
,那是用户手动设置的名字?
谢谢!
更新:我是 运行 django
版本 1.11.2
、factory_boy
版本 2.8.1
和 python
版本 3.5.2
您可以覆盖 create
方法以仅获取用户关键字。
一个完整的例子是这样的:
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>
如果您想为 create
以外的其他构建策略捕获 kwargs,您还需要为 stub
和 build
方法执行此操作。