2010-06-19 62 views
1

我有一個單元測試,我的GAE應用程序:谷歌App Engine的單元測試:困難的assertEquals

def test_getNeighborhoodKeys_twoCourses(self): 
      cs1110, cs2110 = testutils.setUpSimpleCourses() 

      foo = getFooResult() 
      bar = getBarResult() 

    self.assertEquals(foo, bar) # fails 

這是失敗的:

AssertionError: set([CS 1110: Untitled, CS 2110: Untitled]) != set([CS 2110: Untitled, CS 1110: Untitled]) 

它看起來對我來說,測試應該通過。出了什麼問題?

回答

5

看起來像屬於集foobar的項目是一些非常時髦的類型,它會覆蓋__repr__ - 否則,對於正常類型,將會有引號來明確括號內的內容。因此,該類型還必須覆蓋__eq__以確定相等條件(否則,默認情況下,兩個實例只有在它們是相同實例時才相等)。您可以替代覆蓋__cmp__,但這是一個非常古老和塵土飛揚的方法 - 現在比較喜歡__eq__等特定比較!

如果你重寫(爲此事或__cmp____eq__一定也要重寫__hash__,因爲它是重要的兩個是比較平等的情況下,具有完全相同的哈希過,否則使用這樣的情況下,作爲集成員,或鍵在字典中,很難預測方式。

+0

實際上,我自己覆蓋'__repr__'來使調試更容易。這是一個糟糕的決定嗎?如果我要重寫'__str__'呢?我可以離開'__eq__'和'__hash__'嗎? – 2010-06-19 19:16:26

+0

@Rosarch,只要你希望用戶編碼類型的實例能夠比較相同而不相同(即相同的實例),你需要重寫'__eq__'(和'__hash__')提到'__repr__'的覆蓋是因爲可以立即在你顯示的消息中發現什麼,並且證明這些實例屬於某種時髦的類型並且不是完全相同的實例,**不**因爲覆蓋有任何做平等測試本身。 – 2010-06-19 19:24:10