【问题标题】:Why does this QUnit test fail?为什么这个 QUnit 测试失败了?
【发布时间】:2014-12-01 05:29:55
【问题描述】:

我正在尝试学习单元测试,我发现了 Ben Alman 的 overview。在幻灯片23 上,他展示了一个名为actual 的变量如何包含对象{a: 1} 不等于对象本身。这意味着什么?它们的价值不一样吗?对象怎么可能不同?

test("deepEqual", 7, function() {
  var actual = {a: 1};

  equal(    actual, {a: 1},   "fails because objects are different");
  deepEqual(actual, {a: 1},   "passes because objects are equivalent");
  deepEqual(actual, {a: "1"}, "fails because '1' !== 1");

  var a = $("body > *");
  var b = $("body").children();

  equal(    a,       b,       "fails because jQuery objects are different");
  deepEqual(a,       b,       "fails because jQuery objects are not equivalent");
  equal(    a.get(), b.get(), "fails because element arrays are different");
  deepEqual(a.get(), b.get(), "passes because element arrays are equivalent");
});

【问题讨论】:

  • 你熟悉== 是如何比较 JS(实际上是大多数语言)中的对象吗?答案随即而来。
  • 如果这听起来很愚蠢,我很抱歉,但我真的不明白。我正在阅读有关===== 的信息,并且我了解new String("String") == "String"` 为真而new String("String") === "String"` 为假。但是对于对象,这对我来说毫无意义。我什至做了console.log(typeof actual); 来查看我是否缺少该类型,但它们是同一类型。在另一个 SO 响应中,有人将这些对象与 2 张白纸进行了比较。它们都是纸(===),但它们不是同一张纸(==),因为另一个 {a: 1} 是新创建对象的另一个实例。
  • 我应该这样想吗?
  • 这基本上是正确的思考方式。 == 询问“这些是同一个对象”,而不是“这两个对象看起来是否相同”。就像刚出生的同卵双胞胎不是同一个人一样,尽管具有所有相同的属性,但两个对象即使包含相同的属性也不相等。

标签: javascript unit-testing qunit


【解决方案1】:

JS 中的对象永远不会相同,即使它们的值看起来是相同的。主要归结为不同的情况。阅读更多关于Sameness in JavaScript。 StackOverflow上还有muchbetter的真实细节解答。

您可以看到deepEqual 如何确定对象的“相同性”here。另一个值得一看的是lodash's implementation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多