采用以下示例es6类:
export default class sellerController {
saveOrUpdate(){
return this.id ? this.updateSettings.bind(this) : this.saveNewSettings.bind(this);
}
}
我正在尝试为saveOrUpdateMethod构建单元测试。
it("Should select between save or update if id is or isn't set", function() {
var saveOrUpdate = SellerDetailsCtrl.saveOrUpdate();
expect(saveOrUpdate).toEqual(SellerDetailsCtrl.updateSettings.bind(SellerDetailsCtrl))
});
但这似乎不起作用。错误是
预期功能等于功能。
甚至可以这样做吗?验证我已将特定函数绑定到变量?
答案 0 :(得分:0)
由于bind
总是返回新的匿名函数,您可以尝试按函数体进行比较:
var saveOrUpdate = SellerDetailsCtrl.saveOrUpdate();
expect(saveOrUpdate.toString()).toEqual(SellerDetailsCtrl.updateSettings.bind(SellerDetailsCtrl).toString())
但是,这只会确保返回绑定函数,而不会理解绑定哪个函数。因此,它无法检查特定的绑定函数。
更好的方法是使用spy
:
spyOn(SellerDetailsCtrl.updateSettings).and.callFake(function() {
return 'updateSettings';
})
var saveOrUpdate = SellerDetailsCtrl.saveOrUpdate();
expect(saveOrUpdate()).toEqual('updateSettings');
另一种方法是覆盖测试的原生bind
,然后将其重置为原生:
var native = Function.prototype.bind;
Function.prototype.bind = (function () {
var originalBind = Function.prototype.bind;
return function (obj) {
var bound = originalBind.apply(this, Array.prototype.slice.call(arguments, 1));
bound.original = this;
return bound;
};
}());
var saveOrUpdate = SellerDetailsCtrl.saveOrUpdate();
expect(saveOrUpdate.original).toEqual(SellerDetailsCtrl.updateSettings);
Function.prototype.bind = native;