2017-06-14 53 views
3

我正在建造一個生產django模型的工廠factory_boy。我想看看用戶輸入內聯的參數。我廠本身看起來像這樣factory_boy提取原始kwargs

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字典與鍵namesome_other_thing,這使得它不可能知道自己輸入參數或不
  • 改寫_create
    • 仍然遇到同樣的問題覆蓋_adjust_kwargs,在kwargs不包含原始kwargs,而是所有的參數都

我認爲很多我以後的功能是在factory_boyStepBuilder(我懷疑它在instantiate方法中)的黑盒子裏,但我不知道如何修改它以做我想做的。

有沒有人有任何想法如何找出哪個kwargs最初設置在s = SomeFactory()的電話?即確定如果我說s = SomeFactory(name='Matt'),那用戶手動設置名字?

謝謝!

更新:我運行django1.11.22.8.1factory_boy版本,python版本3.5.2

回答

1

可以重寫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方法做這個。

+0

嘿@dan_kaufhold,不幸的是使用'_prepare'方法不能解決我的問題。當我創建一個新工廠時觸發該方法,但是'kwargs'的值不等於傳入的原始參數。它包含所有參數 - 例如,在您的示例中,調用'UserFactory(password ='apple ')'會給我一個包含'{「email」:「[email protected]」,「password」:「test123」}'的'kwargs'。我試圖確定一個必填字段是由用戶手動輸入的,還是由工廠生成的。在你的例子中,我無法檢測到'email'是用戶還是機器。 – mjkaufer

+0

@mjkaufer仔細觀察。如果'kwargs'中沒有其他密碼,密碼只能設置爲'test123'。當你真正檢查了第一個代碼示例中'kwargs'的位置時,你會發現它確實是你輸入的'kwargs'。在UserFactory示例中,我就是這麼做的。我檢查密碼是否在'kwargs'中給出並操作。 –

+0

但在我的代碼中,我想查看是否覆蓋現有字段。在你的例子中,如果密碼是UserFactory中的一個字段,你將無法區分是否手動輸入了密碼「kwarg」,或者計算機是否根據「_prepare」方法生成密碼。 – mjkaufer