In primo luogo, mi piacerebbe modificare la vostra definizione di classe un po '(nome di classe maiuscole e risolvere db assegnazione):
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
Per stub tutta la classe:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
sarà creare un'istanza di Wrapper in cui ogni metodo è uno stub. sinon.spy
ci permetterà di spiare l'istanza della classe.
Così si potrebbe esercitare in questo modo:
// 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;
(asserzioni utilizzare chai e sinon-chai)
ho appena detto "esercitarlo" perché questo frammento di codice non è un test vero e proprio. L'istanziazione e le chiamate al metodo saranno fatte dal soggetto in prova.
Ora, se si vuole prendere in giro una dipendenza iniettato da require() -come db = require('database')
nel vostro esempio-, si potrebbe provare uno strumento di test come sia Jest (ma non tramite Sinon) oppure sinonquire che ho creato ispirato da Jest ma per usarlo con sinon plus il tuo strumento di test preferito (il mio è moka). Internamente, sinonquire utilizza la stessa tecnica sopra illustrata di combinare sinon.spy
e sinon.createStubInstance
per eseguire lo stub di una classe.
fonte
2015-10-28 04:53:37
Oh. Quindi sarebbe meglio stub il metodo 'insertUser' piuttosto che la chiamata' this.db' che 'insertUser' fa? – Industrial
Dipende da cosa si sta testando, ma se si vuole verificare se insertUser sta inserendo nel DB che sarebbe un test di integrazione e nessuna stub verrebbe risparmiata dall'usare la logica reale con alcuni nel DB di memoria per "falsificare" un Oracle ad esempio, se vuoi verificare se l'insertUser viene chiamato quando necessario, il metodo insertUser di stub potrebbe essere un modo per farlo ... –