2010-06-19 63 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