Po pierwsze, chciałbym zmodyfikować definicję klasy nieco (nazwa wielka klasa i rozwiązać zadanie db):
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
stub całą klasę:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
utworzy instancję Wrapper, gdzie każda metoda jest skrótem. sinon.spy
pozwoli nam śledzić instancję klasy.
Więc można wykonywać go tak:
// 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;
(twierdzenia używać chai i sinon-chai)
powiedziałem tylko „wykonywać go”, ponieważ ten fragment kodu nie jest rzeczywiste testy jednostkowe. Wywoływanie i wywoływanie metod będzie wykonywane przez testowany przedmiot.
Teraz, jeśli chcesz, aby drwić zależność wstrzykiwany przez require() -such jak db = require('database')
w Twoim Przykładzie, można wypróbować narzędzie do testowania jak obu Jest (ale nie przy użyciu Sinon) lub sinonquire które stworzyłem zainspirowany Jest to, ale można go używać z sinonem i ulubionym narzędziem do testowania (moja koperta to mocha). Wewnętrznie, sinonquire używa tej samej techniki, jak powyżej, łącząc sinon.spy
i sinon.createStubInstance
, aby odgadnąć klasę.
Oh. Więc byłoby lepiej użyć metody 'insertUser' zamiast wywołania' this.db', które wykonuje 'insertUser'? – Industrial
Zależy od tego, co testujesz, ale jeśli chcesz przetestować, czy insertUser wstawia do DB, który byłby testem integracyjnym, i że nie będzie żadnego koduowania, który pozwoli ci uniknąć użycia prawdziwej logiki, z niektórymi w pamięci DB, aby "podrobić" Oracle na przykład, jeśli chcesz przetestować, czy wywołanie metody insertUser jest potrzebne, wówczas może to być metoda kodująca metodę insertUser ... –