2012-11-30 18 views
1

好吧,我知道這將是顯而易見的,但我不能解決如何編寫內部函數的測試。這裏有一段簡單的代碼來說明問題。python unittest - 如何引用一個可調用的函數

def high(x, y): 
    def low(x): 
     return x*2 
    return y*low(x) 

class TestHigh(unittest.TestCase): 
    def test_high(self): 
     self.assertEqual(high(1,2),4) 

    def test_low(self): 
     self.assertEqual(low(3),6) 

結果

Exception: NameError: global name 'low' is not defined 

在「真實」的情況下,我希望能夠測試較低級別功能隔離,以確保所有的路徑行使,只測試時,這是很麻煩從更高的水平。

回答

2

low嵌套在​​高級函數中,所以它不能從函數外部訪問。您的功能的等價物將是high(3,1)

2

您編寫測試以確保公共可見接口按照其規範執行。您不應該嘗試編寫未公開的內部功能測試。

如果您無法通過high()的結果完全測試low(),那麼low()的未經測試部分對於任何事情都無所謂。

+0

這是我的藉口。我被吸引到了WingIDE的重構中,看起來很整潔,但是如果嵌套函數不是單獨測試的話,它並沒有什麼幫助。首先將它寫在可測試的部分看起來就是這裏的教訓。非常感謝。 –

1

:嘗試製作一個類並添加函數作爲方法(或staticfunctions)。

(在這裏我要離開這個作爲什麼不該做參考。)

GOOD:編寫模塊級的功能,或接受你不能測試它,如果你巢它

+4

請不要。這不是Java。這裏不需要類,並且除了命名空間外,幾乎沒有任何理由使用靜態方法,即使classmethods是相等的或優越的)。只需使用模塊級功能即可。 – delnan

相關問題