【问题标题】:Chai deep.equal failing on comparison of {} to promise instanceChai deep.equal 在比较 {} 和 Promise 实例时失败
【发布时间】:2017-08-10 04:54:04
【问题描述】:

试图理解为什么deep.equal 在两个对象非常不同的情况下仍然通过:

it.only('fetches a footer', () => {
  const fetchedAction = { type: FETCH_FOOTER, payload: {} };
  mockGet(host, 'footer.json', null, null);

  const action = fetchFooter();
  expect(action).to.deep.equal(fetchedAction);
});

以下是 action 与 fetchedAction 的比较值:

注意payload 属性如何不是同一类型的对象。那如果是这样的话,我的期望怎么没有失败呢?

相关(是的,我读过这篇文章,但仍然不确定为什么只是 deep.equal 不会在这里失败):http://chaijs.com/api/bdd/#method_deep

【问题讨论】:

    标签: javascript testing ecmascript-6 mocha.js chai


    【解决方案1】:

    您在 http://chaijs.com/api/bdd/#method_deep 链接到的文档指向 https://github.com/chaijs/deep-eql#rules,这解释了这一切:

    • 根据 Object.is 的不可遍历节点的严格相等性:
      • eql(NaN, NaN).should.be.true;
      • eql(-0, +0).should.be.false;
    • 考虑所有自己的和继承的可枚举属性:
      • eql(Object.create({ foo: { a: 1 } }), Object.create({ foo: { a: 1 } })).should.be.true;
      • eql(Object.create({ foo: { a: 1 } }), Object.create({ foo: { a: 2 } })).should.be.false;
    • 参数不是数组:
      • eql([], arguments).should.be.false;
      • eql([], Array.prototype.slice.call(arguments)).should.be.true;
    • 错误对象通过引用进行比较(参见 chaijs/chai/issues/608):
      • eql(new Error('msg'), new Error('msg')).should.be.false;
      • var err = new Error('msg'); eql(err, err).should.be.true;

    因此,鉴于您的示例对象,唯一适用的规则是

    考虑所有自己的和继承的可枚举属性

    这是关键。您的两个对象具有相同的可枚举属性。这两个循环都不打印:

    for (var prop in {}) console.log(prop);
    

    for (var prop in Promise.resolve({key: 'value'})) console.log(prop);
    

    promise 打印的方括号中的属性是特定于引擎的内部数据,不是对象属性。

    【讨论】:

    • 但我没有解决我的测试中的承诺......所以我想如果我想检查对象类型,嗯我该怎么做。 Promise 与 {} 不是相同的对象“类型”。那么什么是测试这个的正确方法呢?
    • 与promise是否被resolve无关,只是promise对象和空对象比较相等。如果你想测试 Promise 的 result 是否等于某个值,你必须在里面执行 .then 并在里面使用 Promise 分辨率值执行 expect
    • 我也是这么想的,但是the code 也会检查对象的type 是否相同,并且应该识别出原生的Promise
    • 嗯,@PositiveGuy 你在使用 Babel,如果是,你在使用什么插件?
    • 你在用babel-polyfill吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-16
    相关资源
    最近更新 更多