【问题标题】:Google App Engine Unittest: Difficulty with AssertEqualsGoogle App Engine 单元测试:AssertEquals 的难度
【发布时间】:2010-06-19 19:08:09
【问题描述】:

我的 GAE 应用有一个单元测试:

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])

在我看来,测试应该通过了。怎么了?

【问题讨论】:

    标签: python google-app-engine unit-testing


    【解决方案1】:

    看起来属于集合foobar 的项目是一些非常时髦的类型,它会覆盖__repr__——否则,对于普通类型,会有引号来明确这些括号内的内容。因此,该类型还必须覆盖__eq__ 以确定相等条件(否则,默认情况下,只有当它们是 same 实例时,两个实例才相等)。您也可以覆盖__cmp__,但这是一种非常陈旧且尘土飞扬的方法——如今,__eq__ 等特定比较非常受欢迎!

    如果您确实覆盖了__eq__(或__cmp__),请确保也覆盖__hash__,因为两个比较相等的实例也必须具有完全相同的哈希值,否则使用这些实例作为成员集合或字典中的键的行为非常难以预测。

    【讨论】:

    • 实际上,我自己覆盖了__repr__ 以使调试更容易。这是一个糟糕的决定吗?如果我要覆盖__str__ 会怎样?然后我可以不理会__eq____hash__ 吗?
    • @Rosarch,您需要覆盖__eq__(可能还有__hash__),只要您希望用户编码类型的实例能够比较相等而不相同(即相同的实例) -- 我提到覆盖__repr__ 的唯一原因是因为可以立即在您显示的消息中发现什么,并证明这些实例属于某种时髦的类型并且不是完全相同的实例,不是 因为该覆盖与平等测试本身有关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-04
    • 2011-08-26
    • 1970-01-01
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-09-04
    相关资源
    最近更新 更多