对于逐字节相同的对象,assertEqual 会失败吗?
assertEqual fails for objects that are byte-for-byte identical?
我有一个单元测试,它比较两个像这样的 1 元素字典:
{SomeClass(): SomeOtherClass()}
dicts肉眼看起来完全一样,键和值的类型也一样。尽管如此,测试还是失败了。
我当然尝试了各种技巧来在它们之间产生一些差异输出,但是 none 曾经显示出这些对象或其任何嵌套属性之间的任何差异。对象很大,所以单元测试差异没有帮助。
作为最后一次孤注一掷的尝试,我尝试对这些指令进行 pickle,然后制作一个 Unix diff,但这也没有显示出任何区别。说我天真吧,但对我来说,这意味着这些对象是逐字节相同的,测试应该通过。这是怎么回事?
相同的泡菜并不意味着字节对字节相同的对象,字节对字节相同的对象不一定相等。
您可能认为使逐字节相同的对象自动相等很容易,但这会遇到很多问题。例如,考虑以下内容:
class Foo(object):
__slots__ = ['x']
x = Foo()
y = Foo()
x.x = y.x = x
除了 GC 元数据,x
和 y
可能逐字节相同。 x
和 y
应该自动相等吗? x
是唯一一个 x
属性指向自身的;这似乎是一个足够大的差异,它们不应该自动相等。
这只是默认情况下尝试执行所需操作的问题之一。事实证明,最容易混淆的默认设置是 ==
按身份工作;除非 __eq__
覆盖发挥作用,否则对象将只等于它们自己。
我有一个单元测试,它比较两个像这样的 1 元素字典:
{SomeClass(): SomeOtherClass()}
dicts肉眼看起来完全一样,键和值的类型也一样。尽管如此,测试还是失败了。
我当然尝试了各种技巧来在它们之间产生一些差异输出,但是 none 曾经显示出这些对象或其任何嵌套属性之间的任何差异。对象很大,所以单元测试差异没有帮助。
作为最后一次孤注一掷的尝试,我尝试对这些指令进行 pickle,然后制作一个 Unix diff,但这也没有显示出任何区别。说我天真吧,但对我来说,这意味着这些对象是逐字节相同的,测试应该通过。这是怎么回事?
相同的泡菜并不意味着字节对字节相同的对象,字节对字节相同的对象不一定相等。
您可能认为使逐字节相同的对象自动相等很容易,但这会遇到很多问题。例如,考虑以下内容:
class Foo(object):
__slots__ = ['x']
x = Foo()
y = Foo()
x.x = y.x = x
除了 GC 元数据,x
和 y
可能逐字节相同。 x
和 y
应该自动相等吗? x
是唯一一个 x
属性指向自身的;这似乎是一个足够大的差异,它们不应该自动相等。
这只是默认情况下尝试执行所需操作的问题之一。事实证明,最容易混淆的默认设置是 ==
按身份工作;除非 __eq__
覆盖发挥作用,否则对象将只等于它们自己。