工厂男孩:定义依赖于其他领域的领域

jsm*_*mar 8 django django-testing factory-boy django-tests

如何定义依赖于其他字段使用的字段factory-boy?

例如,我想定义一个email取决于first name和last name的User.

我尝试使用post_generation装饰器.但是,我的系统需要在创建实例之前定义电子邮件.

jsm*_*mar 16

使用LazyAttribute:

来自文档:

LazyAttribute是一个简单但非常强大的构建块,用于扩展Factory.

它需要一个调用方法作为参数(通常是一个lambda); 该方法应该接受作为唯一参数构建的对象,并返回一个值.

class UserFactory(factory.Factory):
    class Meta:
        model = User

    username = 'john'
    email = factory.LazyAttribute(lambda o: '%s@example.com' % o.username)
Run Code Online (Sandbox Code Playgroud)

或者lazy_attribute装饰器.

来自文档:

如果一个简单的lambda是不够的,你可以使用lazy_attribute()装饰器代替.

这装饰了一个应该采用单个参数的实例方法self; 方法的名称将用作要填充方法的返回值的属性的名称:

class UserFactory(factory.Factory)
    class Meta:
        model = User

    name = u"Jean"

    @factory.lazy_attribute
    def email(self):
        # Convert to plain ascii text
        clean_name = (unicodedata.normalize('NFKD', self.name)
                        .encode('ascii', 'ignore')
                        .decode('utf8'))
        return u'%s@example.com' % clean_name
Run Code Online (Sandbox Code Playgroud)