使用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 上)