生产代码中的模拟方法,而不是测试中的方法

时间:2017-09-27 11:49:09

标签: python mocking

我的代码中有一个方法,如下所示:

def save(items):
   try:
       for item in items():
          do_something(item)
   except Exception:
      my_logging.warning("error happened")

def do_something(item):
   pass

我想从代码中的其他位置调用此方法,但是,我想调用另一种方法而不是do_something(item)

@transaction.atomic
def do_with_transaction(item)
   delete(item)
   do_something(item)

对生产代码使用带副作用的mock是否可以?这样我就可以模仿do_something()来使用do_with_transaction(item)。 它看起来像一个干净的解决方案。

1 个答案:

答案 0 :(得分:2)

如果你想要的是重用save(items)但是在do_something()循环中调用另一个函数(而不是for),只需将所需的函数作为参数传递:

def save(items, callback=do_something):
   for item in items():
       try:
          callback(item)
       except Exception as e:
          my_logging.exception("error %s happened on item %s", e, item)

然后:

save(items, do_something_with_transaction)