2016-10-18 2 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; 
Смежные вопросы