2015-05-29 22 views
2

比方說,我有一個記錄爲collections.Sequence ABC的函數。如何在ABC函數中測試這個函數中的代碼?我可以編寫單元測試(或測試)來確認我的代碼只調用由此ABC定義的方法,而不是通過list定義的方法或collections.Sequence的其他具體實現?還是有其他工具或方法來驗證這一點?測試Python代碼只使用ABC方法

回答

1

只需通過傳遞僅實現這些方法的類的實例來測試該函數。如果你需要,你也可以繼承一個內置的類型,如list並覆蓋其__getattribute__方法,如:需要通過代碼

class TestSequence(list): 
    def __getattribute__(self, name): 
     if name not in collections.Sequence.__abstractmethods__: 
      assert(False) # or however you'd like the test to fail 
     return object.__getattribute__(self, name) 
+0

「僅實現這些方法的類的實例」 - 這是我所要求的核心,我想:有沒有更容易的方法來獲得這樣的事情?你的方法有效,但是複製了已經在ABC中的信息。因此,存在不同步的風險,導致另一個錯誤等等。(另外,如果有人這樣做,他們可能會更好地使用模擬對象或類似的...取決於測試。) – detly

+0

將使用'如果名稱不在Sequence .__ abstractmethods__'中解決您的問題? – jangler

+0

然後我會更新我的答案以反映這一點。 – jangler

0

直接實現ABC自己,用方法爲瑣碎或複雜的:

import collections 

class TestSequence(collections.Sequence): 

    def __init__(self): 
     pass 

    def __len__(self): 
     return 3 

    def __getitem__(self, index): 
     return index 

如果你犯了一個錯誤,並忽略抽象方法的實現,你的代碼會產生一個錯誤:

TypeError: Can't instantiate abstract class TestSequence with abstract methods __getitem__ 

如果你的被測代碼調用ABC未定義的方法,您將看到通常沒有屬性錯誤:

AttributeError: 'TestSequence' object has no attribute 'pop'