簡體   English   中英

對方法包裝器進行單元測試

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM