测试两个对象“在它们自己的可枚举属性上深相等”

时间:2019-12-29 01:09:17

标签: javascript typescript serialization chai

使用chai断言,如何将文字对象和 Typescript 类实例测试为相等?外部测试的目的是使类实例可序列化,然后稍后用序列化的数据重新合并新实例。

简而言之,我需要测试一下:

  • 参考文献可以不同
  • 可枚举的自身属性必须深等于
  • 不可枚举的自身属性可以不同(followUrl
  • 继承的属性和原型(makeFollowFn)可能不同

class Wrapper {
  constructor(data) {
    _.forIn(data, (value, key) => {
      Object.defineProperty(this, key, {
        value: value,
        enumerable: true
      });
    });
    // inject a function as a not enumerable property
    // simplified here, I wouldn't actually be able 
    // to just add a followUrl function in the prototype
    if (this.url) {
      Object.defineProperty(this, 'followUrl', {
        value: this.makeFollowFn(this.url),
        enumerable: false
      });
    }

  }

  makeFollowFn(url) {
    return () => fetch(url); // and other things
  }
}

const result = {
  data: {
    url: 'http://some.where/',
    a: 1
  }
};
const wrap = new Wrapper(result.data);

chai.expect(wrap).respondTo('followUrl');
chai.expect(wrap).to.be.deep.equal(result.data);

console.dir(result.data);
console.dir(wrap);
console.log(JSON.stringify(wrap));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/chai/4.2.0/chai.min.js"></script>

实际上,一切在这里都可以正常工作:在编写时看到它,感到困惑,意识到唯一的区别是我最初是在Typescript中编写该类的。

因此,它将类编译为一个函数:

var Wrapper = (function () {
    function Wrapper(response) {
        // constructor code
    }
    Wrapper.protoype.makeFollowFn = function(url) {
        // …
    }
    return Wrapper;
}());

这可能是导致不平等的原因,控制台输出:

{ url: 'http://some.where/', a: 1 }
Wrapper { url: 'http://some.where/', a: 1 }

有什么想法可以使它与Javascript一样工作吗?

更新:将编译目标设置为 es6 使其可以正常工作,但出于兼容性原因,它需要保留在 es5 上)

0 个答案:

没有答案