2016-11-30 2 views
0

Ich versuche, den Griff des Tools Nock zu bekommen, um die Anfrage und Antwort von meinem Code die Anrufe zu verspotten. Ich benutze npm-Anfrage als einen einfachen HTTP-Client, um die Back-End-REST-API, Chai für die Erwartungsbibliothek und Mocha, um meine Tests zu starten. Hier ist der Code, den ich für die Tests haben:Mocking NodeJS Anfrage und Antwort mit Nock

var nock = require('nock'); 
var storyController = require('../modules/storyController'); 

var getIssueResponse = { 
    //JSON object that we expect from the API response. 
} 

it('It should get the issue JSON response', function(done) { 
    nock('https://username.atlassian.net') 
    .get('/rest/api/latest/issue/AL-6') 
    .reply(200, getIssueResponse); 

    storyController.getStoryStatus("AL-6", function(error, issueResponse) { 
    var jsonResponse = JSON.parse(issueResponse); 

    expect(jsonResponse).to.be.a('object'); 
    done(); 
}) 
}); 

Und hier ist der Code, die GET-Anforderung zu tun:

function getStoryStatus(storyTicketNumber, callback) { 
    https.get('https://username.atlassian.net/rest/api/latest/issue/' + storyTicketNumber, function (res) { 

    res.on('data', function(data) { 
    callback(null, data.toString()); 
    }); 

    res.on('error', function(error) { 
    callback(error); 
    }); 
    }) 
} 

Dieser einzige Test ist vorbei und ich verstehe nicht, warum. Es scheint, als würde es tatsächlich einen Anruf tätigen und nicht meine gefälschte Nock-Anfrage/Antwort verwenden. Wenn ich den Nock Abschnitt oder Änderung Kommentar:

.reply(200, getIssueResponse) to .reply(404) 

Es bricht nicht den Test und nichts ändern, ich bin nicht mit meinem Nock Variable etwas zu tun. Kann mir bitte jemand ein klares Beispiel erklären, wie man die Anfrage und Antwort in meinem NodeJS-HTTP-Client mit Nock überspitzt?

+0

wo ist Antwortende-Rückruf? – Dhirendra

+0

@Dhirendra Ich denke, es ist ziemlich klar in den geposteten Code, der Rückruf ist meine Funktion, die ich übergeben "Callback" und die Antwort ist data.toString() –

Antwort

1

TLDR: Ich denke, dein Code macht mehr als das, was er dir sagt.

Wichtiger Hinweis: wenn eine HTTP-Anfrage in "stream mode" die data Ereignis könnte setzen (und wahrscheinlich auch der Fall ist) wird mehrfach gebrannt, die jeweils für einen „Brocken“ von Daten über Internet-Chunks zwischen 1.400-64.000 Bytes variabel sein könnte, so erwartet mehr Rückruf Anrufungen (das ist eine ganz besondere Art von schlecht)

Als einfachen Vorschlag, Sie versuchen, request mit oder verketten nur die empfangenen Daten, dann rufen Sie den Rückruf auf dem end Ereignis.

ich einen sehr kleinen Schnipsel mit der letzteren Technik versucht habe

var assert = require('assert'); 
var https = require('https'); 
var nock = require('nock'); 

function externalService(callback) { 
    // directly from node documentation: 
    // https://nodejs.org/api/https.html#https_https_get_options_callback 
    https.get('https://encrypted.google.com/', (res) => { 

    var data = ''; 
    res.on('data', (d) => { 
     data += d; 
    }); 

    res.on('end',() => callback(null, JSON.parse(data), res)); 
    // on request departure error (network is down?) 
    // just invoke callback with first argument the error 
    }).on('error', callback); 
} 


describe('Learning nock',() => { 
    it('should intercept an https call', (done) => { 
    var bogusMessage = 'this is not google, RLY!'; 

    var intercept = nock('https://encrypted.google.com').get('/') 
     .reply(200, { message: bogusMessage }); 

    externalService((err, googleMessage, entireRes) => { 
     if (err) return done(err); 

     assert.ok(intercept.isDone()); 
     assert.ok(googleMessage); 
     assert.strictEqual(googleMessage.message, bogusMessage); 
     assert.strictEqual(entireRes.statusCode, 200); 

     done(); 
    }); 

    }) 
}) 

Und es funktioniert sehr gut, auch bei der Verwendung von on('data')

Edit:

Reference on how to handle correctly a stream

I erweitert das Beispiel als vollwertiges Mokka Beispiel

+0

Vielen Dank für Ihre Antwort, aber ich sehe nicht, wo Sie sind Verwenden Sie das "Ende" -Event und wo ist Ihre Test-Erwartung? Ich bin mir nicht sicher, wie man HTTP-Anfragen mit Nock vortäuscht, Ihr Code tut nicht viel von dem, was ich bereits habe. Vielleicht liege ich falsch, aber wenn du das erklären kannst? –

+0

Doing expect (res.statusCode) .to.equal (404) lässt immer noch die Tests passieren –

+0

Ich habe jetzt einen vollwertigen Test gemacht, aber natürlich passiert es wild .. Ich denke, Sie sollten beginnen, die Probleme zu isolieren. Versuchen Sie es mit einer viel einfacheren Schnittstelle mit Anfrage/Anfrage anstelle von Vanille node.js Anruf, dann überprüfen Sie, ob Mocha korrekt ausgeführt wird, und viele andere Details, die hier nicht eingetragen werden können – colthreepv