2014-12-13 19 views
5

Przepraszam, jeśli to proste pytanie, jestem względnie nowy w Node i Sinon. Staram się dowiedzieć, jak twierdzić, że zagnieżdżona funkcja asynchroniczna została wywołana w Nodejs.Sinon - jak zagnieżdżać funkcję zagnieżdżoną?

Używam mocha, chai, sinon i prośba (https://github.com/request/request), ale myślę, że brakuje mi czegoś podstawowego w tej części.

przykład wewnątrz my_app.js -

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(); 

Wewnątrz testu. Próbuję zablokować wywołanie, aby poprosić o podanie fałszywych danych i zwrócić je. Ale wciąż otrzymuję błąd „wniosek nie został zdefiniowany” na linii, gdzie "m tworzenie niedopałek.

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(); 
     }); 
    }); 

}); 

wiem, że mogę przypisać sinon.stub (objname«funcname») lub (sinon.stub "funcname"), ale te ustawiają tylko zewnętrzny obiekt, próbuję odgasić żądanie funkcji, które jest w funkcji getTicker.

Jakieś pomysły na to, jak to zrobić? Może potrzebuję użyć również szpiega (ale jak?) Czy istnieje lepsze podejście do testowania powyższej funkcji getTicker?

Odpowiedz

6

Otrzymujesz niezdefiniowaną wiadomość, ponieważ zmienna request jest nieznana withi w zakresie twojego testu. Jednak nawet gdybyś to poprawił i przypisać bibliotekę request do zmiennej, nadal otrzymasz błąd, ponieważ sinon wymaga metody na dowolnym dostarczonym obiekcie w celu utworzenia kodu pośredniczącego.

Konsekwencją takiego działania jest to, że sama funkcja request nie może zostać zgaszona, ponieważ nie istnieje w obiekcie, ale jako funkcja, do której zdefiniowane są inne metody. Aby wesprzeć testowalność, lepiej byłoby zrezygnować z używania kodu request bezpośrednio, a zamiast tego użyć jego dołączonych metod, które mogą zostać zgasione. Np

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); 
}); 

(Należy zauważyć, że prowadzenie mokkę asynchroniczny jest nie-niezbędne, gdy pośredniczący jest synchroniczny).

+0

Ok, niesamowite, nie myślałem, aby skorzystać z metody get na tym. Teraz mogę również użyć szpiega do sprawdzenia, czy wywołanie zwrotne zostało wywołane, jak sądzę. –

+0

Ahh tak, mogę sprawdzić, czy wywołanie zwrotne zostało wywołane. ale używam trochę innej składni 'mymodule.getTicker (callback);' 'request.get.should.have.been.called;' oraz 'request.get.should.have.been.called;' Thanks a ton ! –