使用jasmine期望已将函数分配给变量?

时间:2016-10-18 04:55:41

标签: javascript unit-testing jasmine ecmascript-6

采用以下示例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))
    });

但这似乎不起作用。错误是

  

预期功能等于功能。

甚至可以这样做吗?验证我已将特定函数绑定到变量?

1 个答案:

答案 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;