[英]Unit-test a method wrapper
我有一組共享一些基本檢查的操作。 我的代碼如下所示:
def is_valid(param): …some pretty complex things unit-tested on their own…
class BaseAction(object):
def run(self, param):
if not is_valid(param):
raise ValueError(…)
return self.do_run(param)
class Jump(BaseAction):
def do_run(self, param): …
class Sing(BaseAction):
def do_run(self, param): …
我應該如何對BaseAction.run執行驗證的事實進行單元測試?
我想我可以對Jump.run和Sing.run進行單元測試,但是要正確執行它,我需要為BaseAction的每個子類編寫測試,這可能會涉及很多情況。 這也意味着將子類的測試與基類方法的測試耦合起來。
您將對is_valid()
函數本身進行單元測試。 然后,您只需測試傳遞無效輸入時.run()
會引發ValueError
異常的事實:
with self.assertRaises(ValueError):
objectundertest.run(invalid_parameter)
由於您已經具有is_valid()
本身的單元測試,因此.run()
無需關注其功能。 您可以專注於.run()
獨有的功能。
在您的情況下, BaseAction
是為子類提供服務的單元; 我將其作為模擬子類進行測試:
class MockAction(BaseAction):
run_called = None
def do_run(self, param):
self.run_called = param
因此,您可以檢查run
確實以預期的param
值調用了do_run
。
如果要將邏輯保留在基類中,請參閱Martijn Pieters答案。
但是,一種可能性是重新組織代碼,以使驗證發生在ISN不是Base類的一部分的函數/類中。 也許實際運行動作的類本身可以檢查那些動作...
class Jump(object):
def run(self, param):
...
def run_action(action, param):
if not is_valid(param):
raise ValueError(…)
return action.run(param)
單元測試動作更容易(您不必擔心基本邏輯),並且如果“ BaseAction”被破壞,它也不會破壞所有的“跳轉”單元測試。 本身可以很容易地測試“ run_action”(如果需要,可以使一個類而不是一個函數)(可以創建一個假的“ Action”對象)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.