2016-10-18 29 views
0

看看下面的例子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;