2012-10-10 17 views
12

Aşağıda gösterilen uygulamam için bir veritabanı sarıcı oluşturdum. Bunu test etmek için gerçek veritabanı kütüphanesini değiştirmek isterim. query yöntemine aykırı olan yeni bir sınıf oluşturabilir ve buradaki tüm girdileri yakalayabilirim, ancak sinon.js kullanmak daha uygun görünüyor, ancak nasıl kullanırdım?
mock veya stubsinon.js ürününün özellikleri nelerdir?Sinon.js'de bir dersi mi kestirmek ve/veya alay etmek?

wrapper = (function() { 

    function wrapper() {} 

    wrapper.db = require("database"); 

    wrapper.prototype.insertUser = function(doc) { 
    return this.db.query("INSERT INTO USERS..."); 
    }; 

    return wrapper; 

})(); 

cevap

6

Bunun için ikisini de kullanabilirsiniz.

Mock, beklenen bir davranış varsa, doğru bir şekilde izlenmediyse, size bir hata verecektir.

A Stub bir alayla benzer, ancak sipariş vermeden, yöntemlerinizi istediğiniz gibi arayabilirsiniz. Deneyimlerime göre neredeyse hiç alay gerekmiyor.

Her ikisi de yönteminizi boş bir yöntemle veya birini geçirirseniz bir kapanışla değiştirir. Böyle bir şey olurdu:

stub = sinon.stub(wrapper , 'insertUser ', function() { return true; }); 

Sonra bu gerçekleşti eğer davranış kontrol etmek bekliyoruz ekleyin.

Testleri kontrol etmek için Jasmine'u Jasmine-Sinon ile kullanmayı seviyorum.

+0

Oh. Yani 'insertUser' yerine' insertUser' yerine 'this.db'-call yerine 'insertUser' yöntemini kullanmak daha iyi olurdu? – Industrial

+2

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 ... –

8

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.

+0

Jest bağlantıları güncelleştirildi: https://facebook.github.io/jest/docs/mock -functions.html http://facebook.github.io/jest/docs/jest-object.html#jestenableautomock – jwadsack

İlgili konular