Birincisi, sınıf tanımını biraz değiştirmek (büyük harf sınıf ismi ve db atama düzeltmek) ediyorum:
var WrapperStub = sinon.spy(function() {
return sinon.createStubInstance(Wrapper);
});
sinon.createStubInstance
bir örneğini oluşturur:
var Wrapper = (function() {
function Wrapper() {
this.db = require("database");
}
Wrapper.prototype.insertUser = function(doc) {
return this.db.query("INSERT INTO USERS...");
};
return Wrapper;
})();
bütün sınıfı saplama için Her yöntem bir saplama olduğu Wrapper. sinon.spy
, sınıf örneğini gizlememize izin verecek.
Yani bunun gibi egzersiz olabilir:
// 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;
Bu kod parçacığı gerçek birim test olmadığı için sadece "it egzersiz" dedi
(iddialar chai ve sinon-chai kullanın). Denekleme ve yöntem aramaları test edilen konu tarafından yapılacaktır.
Şimdi, enjekte bağımlılığı alay etmek istiyorsanız örnek- içinde db = require('database')
olarak, ne esinlenerek oluşturulan bir test ya Jest (ama kullanmıyor sinon) gibi aracını veya sinonquire deneyebilirsiniz -bunlar) (gerektirir Jest ama sinon artı favori test aracı ile kullanmak için (benim mocha). Dahili olarak, sinonquire, bir sınıfı stub oluşturmak için sinon.spy
ve sinon.createStubInstance
'un birleştirilmesiyle yukarıda gösterilen aynı tekniği kullanır.
Oh. Yani 'insertUser' yerine' insertUser' yerine 'this.db'-call yerine 'insertUser' yöntemini kullanmak daha iyi olurdu? – Industrial
Neyi test ettiğinize bağlı olarak değişir, ancak eğer insertUser bir bütünleştirme sınaması olan DB'ye ekleyip eklemediğini sınamak isterseniz ve bir stubbing'in bir Oracle bellekte gerçek mantığı kullanarak sizi bir Oracle'dan "sahte" kılmak için kurtaracağını Örneğin, insertUser gerektiğinde çağrılırsa sınamak istiyorsanız, insertUser yöntemi, bunu yapmanın bir yolu olabilir ... –