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.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dank Matt Mokary (wenn Sie möchten, senden Sie eine Antwort, die ich gebe Ihnen den Kredit für diesen)
Ich bearbeitete meinen test wie folgt...
Die Sache, dass es behoben wurde, wie von Matt vorgeschlagen, mit...
mit der leichten Anpassung der
bekommen das erste argument (das ist der options-Objekt).
Nebenbei entdecken, dass ich verwenden können-Konsole.anmelden, um zu sehen, was passiert, wenn ich führe einen test durch Phantom und Karma war eine Offenbarung und ein headslapping moment.