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>')