2014-12-13 25 views
5

Eğer bu basit bir soru ise özür dilerim, Node ve Sinon için nispeten yeniyim. Nodejs'de yuvalanmış asenkron bir işlevin çağrıldığını anlamaya çalışmak için uğraşıyorum.Sinon - iç içe geçmiş işlevi nasıl yönlendirilir?

Ben mocha, chai, sinon ve istek (https://github.com/request/request) kullanıyorum ama sanırım saplama parçası üzerinde temel bir şey eksik düşünüyorum. my_app.js içinde

Örnek - testi içinde

var request = require('request'); 

function MyModule() { 
}; 

MyModule.prototype.getTicker = function(callback) { 
    request('http://example.com/api/ticker', function(error, response) { 
     if (error) { 
      callback(error); 
     } else { 
      callback(null, response); 
     } 
    }); 
}; 

exports.mymodule = new MyModule(); 

. Geri dönmek için istekte bulunmaya ve bazı sahte veriler sağlamaya çalışıyorum. Ama on line "istek tanımlanmadı" bir hata almaya devam "saplama oluşturarak ediyorum.

var myApp = require('../my_app.js') 
    ,assert = require("assert") 
    ,chai = require('chai') 
    ,sinon = require('sinon') 
    ,expect = chai.expect; 

describe('mymodule object', function() { 

    var mymodule = myApp.mymodule; 

    before(function(done) { 
     sinon.stub(request).yields(null, JSON.stringify({ 
      price: '100 USD' 
     })); 
     done(); 
    }); 

    it('getTicker function should call request on example ticker', function(done) { 
     mymodule.getTicker(function(error, result){ 
      request.called.should.be.equal(true); 
      done(); 
     }); 
    }); 

}); 

ben sinon.stub (objname, atayabilirsiniz biliyorum 'funcname') ya da sinon.stub ("funcname"), ancak sadece dış nesneyi ayarlıyorum, getTicker işlevinin içindeki işlev isteğini saplamaya çalışıyorum.

Bunu nasıl yapacağınıza dair herhangi bir fikir var mı? Belki de bir casus kullanmalıyım (ama nasıl?) Veya yukarıdaki getTicker işlevini sınamak için daha iyi bir yaklaşım var mı?

cevap

6

Tanımlanmamış iletiyi alıyorsunuz çünkü request değişkeni withi bilinmiyor Testinizin kapsamı. Ancak, bunu düzeltip request kitaplığını değişkene atamış olsanız bile, bir saplama oluşturmak için sinonun sağlanan herhangi bir nesne üzerinde bir yöntem gerektirdiğinden hala bir hata alırsınız. Bunun sonucu olarak, request işlevinin kendisi, bir nesne üzerinde bulunmadığı için değil, diğer yöntemlerin tanımlandığı bir işlev olarak dizilmeyeceğidir. Bu nedenle, test edilebilirliği desteklemek için, request kodunuzu doğrudan kodunuzda kullanmak tercih edilir ve bunun yerine eklenmiş yöntemleri kullanabilir. Örneğin:

my_app.js

MyModule.prototype.getTicker = function(callback) { 
    request.get('http://example.com/api/ticker', function(error, response) { 
    ... 
    }); 
}; 

my_test.js

var request = require('request'); 

before(function() { 
    sinon.stub(request, 'get').yields(null, JSON.stringify({price: '100 USD'})); 
}); 

it('getTicker function should call request on example ticker', function() { 
    mymodule.getTicker(); 
    request.get.called.should.be.equal(true); 
}); 

(bir saplama uyumlu olduğu zaman zaman uyumsuz kahverengisini çalışan un gerekli olduğuna dikkat edin).

+0

Tamam, bu yöntemde get yöntemini kullanmayı düşünmedim. Şimdi de geri arama çağrıldığını doğrulamak için bir casus kullanabilirim. –

+0

Ahh yup Geri aramanın çağrıldığını doğrulayabilirim. ama biraz farklı bir sözdizimi kullanıyorum mymodule.getTicker (geri arama); 'request.get.should.have.been.called;' ve request.get.should.have.been.called; 'teşekkürler ton ! –