模拟 Model.objects.bulk_create 和 Model.save()

Mocking both Model.objects.bulk_create and Model.save()

我正在尝试模拟 bulk_createsave 以获得干燥的 运行。 我创建了本质上执行以下操作的代码:

@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):