2012-05-09 12 views
1

我剛剛遇到@unittest.skipIf(expression)的問題。那麼,問題是,如果我在開始測試之前聲明並賦值的裝飾器中使用了變量,並且在測試過程中此變量的值被更改,則效果會使裝飾器包含舊值。例如:[@ unittest.skipIf修飾器]條件的過時值

class Settings(object): 
    flag=False 
class TestCase(object): 

    # during the test variable is changed (in this module or another) 
    Settings.flag=True 

    @unittest.skipIf(Settings.flag==True) 
    def test_something(self): 
     ... 

Settings.flag值可以在另一個模塊或該模塊被改變(這並不重要)。在這兩種情況下,在調用test_something期間條件Setting.flag==True仍然採用「假」值,儘管它已經更改爲「真」值。這很奇怪,我承認我不明白這個機制是如何工作的。看來這個裝飾器中使用的值在測試過程中不能改變。也許還有一些其他有趣的方法可以在特定條件下跳過測試,這在測試過程中可能會發生變化。有沒有人有一個想法如何解決這個問題?

+0

讓我得到這個直。如果'flag'爲true,您想要跳過測試。這是真的,所以你跳過測試。後來,你改變了'旗' - 你想回到過去,神奇地「迴避」它嗎? – katrielalex

+0

編號默認值爲FALSE,在測試期間值變爲TRUE時,但skipIf將該值仍讀取爲FALSE。 'test_something'調用之前,值正在改變。 –

回答

1

是的,這是預期的行爲。函數參數在函數被調用時被評估。裝飾器是一個函數,當正在裝飾的函數被定義時被調用。因此,該標誌在裝飾函數被定義時進行測試。裝飾者無法知道測試甚至是什麼;它只會看到TrueFalse(或更可能是真實或虛假),因此它不能將該狀態存儲起來以供以後評估。

要使skipIf()按您的需要工作,需要使用函數(例如lambda: Settings.flag==True)而不是布爾值。然後,當實際調用裝飾函數時,它可以稍後評估這種情況。但它實際上並不這樣。 (雖然這可能是一個簡單的增強功能)。

您可以通過不導入包含單元測試的模塊,直到Settings.flag的值建立之後解決此問題。這將推遲測試函數的定義(以及裝飾),然後裝飾器將有權訪問所需的標誌值。不知道你的代碼是如何構造的,我不知道這是否適合你。

此外,一些看起來有鬼Settings.flag==True ...不能完全把我的手指上... ;-)

+0

'@ unittest.skipIf(lambda test = Settings.flag:True if test == True else,「Test skipped」)'不會像我預期的那樣工作,它仍然有FALSE值。你可以給一個示例如何在裝飾器中使用lambda。也許我在做錯誤的東西 –

+0

對不起,例如上面我仍然得到TRUE值當然。無所謂 - 問題依然存在。值正在改變,裝飾者使用lambda語句仍舊收到舊值。 –

+0

對不起,我想我不清楚:'skipIf()'需要寫入接受函數;它不是,所以(與Python中的大多數對象一樣)函數對它是「真」的。 – kindall