2017-02-22 4 views
0

Я пытаюсь использовать Sinon протестировать компонент JS, который выглядит немного как это ...Sinon.JS - Как я могу получить аргументы от заглушки?

import Bootbox from "../helpers/bootbox"; 
import Guard from "../helpers/guard"; 
import UrlHelper from "../helpers/url-helper"; 

export default class DeleteButton { 

    /** 
    * Creates an instance of DeleteButton. 
    * 
    * @param {object} element The DOM element to make into a delete button. 
    * 
    * @memberOf DeleteButton 
    */ 
    constructor(element) { 
     Guard.throwIf(element, "element"); 

     this.deleteUri = element.getAttribute("data-delete-uri") || UrlHelper.current.url().split('?')[0];   
     this.title = element.getAttribute("data-title") || `Delete the item?`; 
     this.cancelText = element.getAttribute("data-cancel") || `Cancel`; 
     this.confirmText = element.getAttribute("data-confirm") || `Remove`; 
     this.message = element.getAttribute("data-message") || `Do you want to delete the item? This cannot be undone.`; 
     this.successUri = element.getAttribute("data-success-uri"); 
     this.errorMessage = element.getAttribute("data-error-message") || `Unable to complete operation.`; 
    } 

    /** 
    * Shows failure of deletion. 
    * 
    * @memberOf DeleteButton 
    */ 
    showFailed() { 
     Bootbox.alert({ 
      message: this.errorMessage, 
      size: `small`, 
      backdrop: true 
     }); 
    } 
} 

Тест выглядит следующим образом ...

it("Can show a fail message", function() { 
    $("body").append(`<a class="js-delete-button" data-id="123" data-delete-uri="/delete/123">Delete</a>`); 
    let objUt = new DeleteButton($(".js-delete-button").get()[0]); 
    let bootboxAlertStub = Sinon.stub(Bootbox, 'alert'); 
    objUt.showFailed(); 
    let args = bootboxAlertStub.args; 
    expect(args.message).to.equal(objUt.errorMessage); 
}); 

Но я не могу получить мимо строки let bootboxAlertStub = Sinon.stub(Bootbox, 'alert');, потому что я получаю сообщение от Karma, говорящего «Обязательно обернуть свойство объекта». Я также попробовал обернуть его в оболочку Sinon.test и с помощью this.stub, но ошибка была еще более тупой.

Я прошел через документы Sinon.JS и искал в Интернете, но я застрял. Код работает нормально.

Я посмотрел на это сообщение, которое похоже - Stubbing a class method with Sinon.js, но это не совсем то же самое.

Глядя на реальный основной bootbox JavaScript файла Я эффективно пытается окурок метод, который выглядит немного как это (вырубить) ...

exports.alert = function() { 
    // do something 
    }; 

Файл JS затем возвращает экспорт в то конец ...

return exports; 

Глядя на некоторых проводок GitHub, кажется, что это не может быть возможно окурок именно эти вызовы, как основные вызовы функций полезности, а не функции объекта.

Я смягчили это (в ужасном пути), изменив свой Bootbox класс обертку следующим образом ...

export default { 

    /** 
    * Generates an alert box. 
    * 
    * @param {any} options 
    */ 
    alert: function(options) { 
     window.bootbox.alert(options); 
    }, 

    /** 
    * Generates a confirmation dialog. 
    * 
    * @param {any} options 
    */ 
    confirm: function(options) { 
     window.bootbox.confirm(options); 
    } 
} 

Это решает одну проблему, и вводит другую. В то время как я могу теперь окурок Bootbox, когда потушил я не могу получить аргументы ....

(из теста)

let args = bootboxAlertStub.args; 

Это расстраивает - Аргументы передаются в качестве комплексного аргумента так Утверждение 'calledWith' не собирается сокращать его.

Есть ли способ получить аргументы для заглушки?

+0

Вы пробовали 'bootboxAlertStub.getCall (0) .args'? –

+0

Чтобы уточнить: аргумент, переданный 'getCall', является« индексом »вызова; '0' является первым вызовом вашего заглушки,' 1' является вторым вызовом и т. Д. –

ответ

2

Благодаря Matt Mokary (если вы хотите, чтобы представить ответ я дам вам кредит на этот)

Я отредактировал мой тест следующим образом ...

it("Can show a fail message", Sinon.test(function() {   
    $("body").append(`<a class="js-delete-button" data-id="123" data-delete-uri="/delete/123">Delete</a>`); 
    let objUt = new DeleteButton($(".js-delete-button").get()[0]); 
    let bootboxAlertStub = this.stub(Bootbox, 'alert'); 
    objUt.showFailed(); 
    Sinon.assert.called(bootboxAlertStub); 
    let options = bootboxAlertStub.getCall(0).args[0]; 
    expect(options.message).to.equal(objUt.errorMessage); 
})); 

То, что неподвижная это было, как это было предложено Мэтт, используя ...

bootboxAlertStub.getCall(0); 

с небольшим корректировкой

bootboxAlertStub.getCall(0).args[0]; 

, чтобы получить первый аргумент (который является объектом опций).

Как в стороне, открытие того, что я могу использовать console.log, чтобы увидеть, что происходит, когда я запускаю тест через Phantom и Karma, было как откровением, так и мгновенным мгновением.

Смежные вопросы