2017-09-27 118 views
1

我有这样的在我的代码的方法:嘲讽方法,而不是在测试

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) 

它是确定使用模拟与生产代码的副作用?这样我可以模拟do_something()使用do_with_transaction(item)。 它在我看来就像一个干净的解决方案。

+0

会这不是一个非常糟糕的做法和设计决定做这样的事情? – AK47

+0

这是我正在试图找出.. – Dejell

+0

这将是。你的代码应该很容易阅读和做这样的事情(especia听起来像你会混淆每一个未来的读者/维护者的代码,但这只是我的2美分 – AK47

回答

2

如果你想要的是重用save(items),但要求在for环路另一个函数(而不是do_something(),只是通过所需的功能参数:

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)