Zuerst würde ich Ihre Klassendefinition ein bisschen (Großklassennamen und beheben DB-Zuordnung) ändern:
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
die ganze Klasse Stub:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
eine Instanz erstellen Wrapper, wobei jede Methode ein Stub ist. ermöglicht es uns, die Klasseninstanziierung auszuspionieren.
So könnte man es so ausüben:
// verify instantiation
var wrapper = new WrapperStub();
expect(WrapperStub).to.have.been.calledWithNew;
// verify method stub
wrapper.insertUser.returns('data');
expect(wrapper.insertUser()).to.equal('data');
expect(wrapper.insertUser).to.have.been.calledOnce;
(Behauptungen verwenden chai und sinon-chai)
ich sagte nur "sie ausüben", weil dieser Code-Schnipsel nicht ein tatsächlicher Unit-Test ist. Instanziierungs- und Methodenaufrufe werden von Ihrem Testobjekt durchgeführt.
Nun, wenn Sie wollen eine Abhängigkeit von erfordern injiziert verspotten() -such als db = require('database')
in Ihrer Beispiel-, können Sie ein Test-Tool wie entweder Jest versuchen könnte (aber mit sinon nicht) oder sinonquire, die ich von inspiriert erstellt Jest aber es mit sinon plus Ihr Lieblingstestwerkzeug zu benutzen (meins ist Mokka). Intern verwendet sinonquire die gleiche oben gezeigte Technik, und sinon.createStubInstance
zu kombinieren, um eine Klasse zu stubben.
Oh. Also wäre es besser, die 'insertUser'-Methode statt des' this.db'-Aufrufs, den 'insertUser' ausführt, auszugeben? – Industrial
Hängt davon ab, was Sie testen, aber wenn Sie testen möchten, ob der insertUser in die DB eingefügt wird, wäre dies ein Integrationstest und kein Stubbing würde Sie davon abhalten, die echte Logik mit einigen in der Speicher-DB zu verwenden, um ein Oracle zu "fälschen" Wenn Sie zum Beispiel testen möchten, ob der insertUser bei Bedarf aufgerufen wird, dann könnte die Methode insertUser als Methode verwendet werden. –