• Strona główna
  • O Projekcie Tabi.pro ( dawniej ToTu)
  • About me

Patryk Nowacki

DevBlog programistyczny

Nock – mocking HTTP library for Node.js (part 2)

22 marca 2016 by Nowas

O zaletach nocka pisałem w poprzednim wpisie. Gdy publikowałem poprzedni wpis był dzień św. Patryka więc jako jego imiennik nie miałem natchnienia na przykłady. Tym wpisem postaram się przedstawić jak używa się Nock’a na podstawie przykładów z ToTu.

Metoda którą chcę testować na wejściu dostaję listę serwerów których, ma się odpytać o dane i po otrzymaniu wszystkich odpowiedzi, ma zwrócić zagregowane dane:


var request = require('request');

var DataTool = function(){
 function getVehiclesDataFromVehicleBeacons(beaconList, callback){
  var responses = [];
  var completed_request = 0;
  beaconList.forEach(function(beacon){
    request(beacon.url, function (error, response, body) {
    completed_request++;
    if (!error && response.statusCode == 200) {
      responses.push(JSON.parse(body).data);
      if (completed_request == beaconList.length) {
        var merged = [].concat.apply([], responses)
        callback(merged);
      }
     }
   })
  });
 };
 return {
  getVehiclesDataFromVehicleBeacons:getVehiclesDataFromVehicleBeacons
 }
};
module.exports = DataTool();

W testach stworzyłem metodę generującą proste mock’i które, zawsze zwracają po otrzymani zapytania HTTP GET na adres url odpowiadają status code 200 z danymi resData:

function createSimpleNock(url, resData){
 var myNock = nock(url)
 .get('/')
 .reply(200, resData); 
}

oraz test

describe('basic collect data tests', function(){
 var testUrl = 'http://test.me'; 
 var config = [{name:'testBeacon', url:testUrl}] 
 
 it('is calling beacon', function(done){
  createSimpleNock(testUrl, {data:[{id:'1'}]});
  tools.getVehiclesDataFromVehicleBeacons(config, function(res){
   done();
  });
 });
});

Biblioteka Nock pozwala również na:

  • mock’owanie żądań POST
     var myNock = nock('http://test.me')
      .post('/vehicles', {
       id: 'vehId1',
       lat: 52,
       lng:21
      }) 
      .reply(201, {resData}); 
    
  • dopasowanie Query string
     var myNock = nock('http://test.me')
     .get('/vehicles')
     .query({lineId: '127'})
     .reply(200, {resData}); 
    
  • zdefiniowanie odpowiedzi jako plik
     var myNock = nock('http://test.me')
     .get('/')
     .replyWithFile(200, __dirname + '/replies/vehicles.json'); 
    
  • uruchomienie wybranej funkcji w celu wygenerowania odpowiedzi
     var myNock = nock('http://test.me')
     .post('/vehicles')
     .reply(201, function(uri, requestBody) {
      return requestBody;
     });
  • zdefiniowanie odpowiedzi jako strumień
     var myNock = nock('http://test.me')
     .get('/vehicles')
     .reply(200, function(uri, requestBody) {
       return fs.createReadStream('vehicles.txt');
     });
  • zdefiniowanie ile zapytań ma przechwycić Nock
    nock('http://test.me').get('/').times(2).reply(200, 'Ok');
    
    http.get('http://test.me'); // odpowiedź "Ok"
    http.get('http://test.me'); // odpowiedź "Ok"
    http.get('http://test.me'); // odpowiedź z test.me
    
  • zdefiniowanie późnienia dla body i headerile zapytań ma przechwycić Nock
    nock('http://test.me')
      .get('/vehicles')
      .delay({
        head: 1000, // opźnienie nagłowka o 1s
        body: 2000  // body będzie opóźnione o kolejne 2s
      })
      .reply(200, '<html></html>')
    
Posted in: Bez kategorii Tagged: Daj się poznać, NodeJS, testy, ToTu
← Nock – mocking HTTP library for Node.js
Socket.io between NodeJS servers →

Most common

Azure AzureDayPL Daj się poznać design pattern GoogleMaps IoT JavaScript Konferencja NodeJS RabbitMQ tdd testy ToTu

Archiwa

  • Maj 2016
  • Kwiecień 2016
  • Marzec 2016
  • Luty 2016

Copyright © 2019 Patryk Nowacki.

Omega WordPress Theme by ThemeHall