django的工厂男孩为非数据库领域

时间:2014-09-16 02:18:57

标签: django testing factory-boy

我有一个django模型,在保存时会触发在外部服务上创建帐户(与django无关)。但是,为了进行测试,我想禁止创建此帐户。我可以覆盖管理器的save()方法并从那里弹出kwarg,或者我可以按照Non-database field in Django model向模型添加非数据库字段属性,并在我的save方法中检查它。

然而,当我尝试使用factoryboy来创建我的对象时,它似乎检查模型中的真实字段,由于该属性不是字段而崩溃。

class MyModel(models.Model):
    name = models.CharField()
    create_external_account = True
    def save(self, *args, **kwargs):
        if create_external_account:
            ...

class MyModelFactory(factory.django.DjangoModelFactory):
    class Meta:
        model = MyModel
    name = factory.Sequence(lambda n: 'name%d' % n)
    create_external_account = False

关于如何通过factoryboy传递额外参数的任何想法?

3 个答案:

答案 0 :(得分:1)

您可以customize使用_create方法。

如果在信号处理程序中创建了外部帐户,您还可以disable signals

答案 1 :(得分:1)

factory_boy' create()调用您的模型的MyModel.objects.create(**kwargs)方法。

当你写MyModelFactory()时,会调用:

obj = MyModel(name="name01", create_external_account=False)
obj.save()
return obj

在这里,您应该覆盖模型的__init__方法来处理自定义字段:

class MyModel(django.db.models.Model):
    def __init__(self, *args, **kwargs):
        self.create_external_account = kwargs.pop('create_external_account', False)
        return super(MyModel, self).__init__(*args, **kwargs)

答案 2 :(得分:0)