Django factory boy mock 工厂中的模型方法
Django factory boy mock model method in factory
我的模型的保存方法在保存后调用 api。为了测试我的应用程序,我使用 DjangoModelFactory
生成用于测试的对象。但是,api 仍然被调用。
class MyClass(models.Model):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.call_api()
我试过模拟该方法,但它不起作用
#...
from .models import MyModel
@pytest.mark.django_db
@patch("MyModel.call_api")
class MyModelFactory(factory.django.DjangoModelFactory, factory.base.BaseFactory):
class Meta:
model = MyModel
我的问题是,当我将它用于工厂时,如何使用模拟方法?
正确的扩展点是Factory._create
:
class MyModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = MyModel
@classmethod
def _create(cls, model_class, *args, **kwargs):
with patch("MyModel.call_api"):
return super()._create(model_class, *args, **kwargs)
请注意:除了factory.django.DjangoModelFactory
之外,您不需要继承factory.base.Factory
,后者已经是前者的子类。
我的模型的保存方法在保存后调用 api。为了测试我的应用程序,我使用 DjangoModelFactory
生成用于测试的对象。但是,api 仍然被调用。
class MyClass(models.Model):
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
self.call_api()
我试过模拟该方法,但它不起作用
#...
from .models import MyModel
@pytest.mark.django_db
@patch("MyModel.call_api")
class MyModelFactory(factory.django.DjangoModelFactory, factory.base.BaseFactory):
class Meta:
model = MyModel
我的问题是,当我将它用于工厂时,如何使用模拟方法?
正确的扩展点是Factory._create
:
class MyModelFactory(factory.django.DjangoModelFactory):
class Meta:
model = MyModel
@classmethod
def _create(cls, model_class, *args, **kwargs):
with patch("MyModel.call_api"):
return super()._create(model_class, *args, **kwargs)
请注意:除了factory.django.DjangoModelFactory
之外,您不需要继承factory.base.Factory
,后者已经是前者的子类。