Sinon.JS - Wie bekomme ich die Argumente für einen stub?

Ich versuche, mit Sinon zu testen, eine JS-Komponente, die sieht ein bisschen wie dieses...

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
        });
    }
}

Der test sieht wie folgt aus...

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);
});

Aber ich kann nicht hinter die Linie let bootboxAlertStub = Sinon.stub(Bootbox, 'alert'); da bekomme ich eine Fehlermeldung von Karma sagen 'Sollten wrap-Eigenschaft des Objekts'. Ich habe versucht, wickeln Sie es in einem Sinon.testen Sie den wrapper, so gut und mit dieser.stub-aber der Fehler ist noch stumpf.

Ich habe durch die Sinon.JS docs und online recherchiert, aber ich bin stecken. Funktioniert der code einwandfrei.

Ich habe mir bei diesem posting, die ähnlich ist - Stubbing eine Klasse mit Methode Sinon.js aber es ist nicht ganz das gleiche.

Blick auf die tatsächlich zu Grunde liegenden bootbox JavaScript-Datei bin ich effektiv versuchen, stub-eine Methode, die ein bisschen aussieht wie diese (cut down)...

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

JS-Datei gibt dann die Exporte am Ende...

  return exports;

Blick auf einige Github-postings, es scheint, dass es möglicherweise nicht möglich sein, stub-diese fordert, wie der zugrunde liegende Anrufe sind utility-Funktionen eher als Objekt-Funktionen.

Habe ich abgemildert in eine schreckliche Art und Weise), indem Sie meinen Bootbox wrapper-Klasse wie folgt...

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);
    }
}

Dies löst ein problem und stellt einen weiteren. Ich kann zwar jetzt stub Bootbox, wenn Stubs kann ich nicht die Argumente....

(aus dem test)

let args = bootboxAlertStub.args;

Dies ist frustrierend - Die Argumente übergeben werden als ein Komplexes argument, so ein "calledWith' Behauptung ist nicht zu schneiden.

Gibt es eine Möglichkeit, ich kann die Argumente für einen stub?

  • Haben Sie versucht bootboxAlertStub.getCall(0).args?
  • Um es klarzustellen: das argument übergeben getCall ist der "index" des Aufrufs; 0 wird der erste Anruf auf Ihrer stub, 1 ist der zweite Aufruf, etc.
Schreibe einen Kommentar