2017-09-27 69 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)