模拟 Model.objects.bulk_create 和 Model.save()
Mocking both Model.objects.bulk_create and Model.save()
我正在尝试模拟 bulk_create
和 save
以获得干燥的 运行。
我创建了本质上执行以下操作的代码:
@mock.patch.object(SomeModel.objects, 'bulk_create')
@mock.patch.object(SomeModel, 'save')
def a_dry_run(mocked_bulk_create, mocked_save):
def print_bulk(obj_list):
print 'doing bulk_create'
for obj in obj_list:
print obj
def print_save(instance):
print 'doing save'
print instance
mocked_bulk_create.side_effect = print_bulk
mocked_bulk_create.return_value = True
mocked_save.side_effect = print_save
mocked_save.return_value = True
问题是,当我执行 bulk_create
而不是 print_bulk
时,它会执行 print_save
。我该如何解决这个问题或者是否有更简洁的方法来解决这个问题?
参数的顺序应该颠倒过来。正如您在 Quick Guide 中看到的,其中 describe patch
传递给函数的模拟参数的顺序从下到上遵循 patch
的装饰器。
在你的情况下,只需更改补丁顺序或函数签名,如
def a_dry_run(mocked_save, mocked_bulk_create):
我正在尝试模拟 bulk_create
和 save
以获得干燥的 运行。
我创建了本质上执行以下操作的代码:
@mock.patch.object(SomeModel.objects, 'bulk_create')
@mock.patch.object(SomeModel, 'save')
def a_dry_run(mocked_bulk_create, mocked_save):
def print_bulk(obj_list):
print 'doing bulk_create'
for obj in obj_list:
print obj
def print_save(instance):
print 'doing save'
print instance
mocked_bulk_create.side_effect = print_bulk
mocked_bulk_create.return_value = True
mocked_save.side_effect = print_save
mocked_save.return_value = True
问题是,当我执行 bulk_create
而不是 print_bulk
时,它会执行 print_save
。我该如何解决这个问题或者是否有更简洁的方法来解决这个问题?
参数的顺序应该颠倒过来。正如您在 Quick Guide 中看到的,其中 describe patch
传递给函数的模拟参数的顺序从下到上遵循 patch
的装饰器。
在你的情况下,只需更改补丁顺序或函数签名,如
def a_dry_run(mocked_save, mocked_bulk_create):