2017-09-19 4 views
0

Je n'arrive pas à comprendre pourquoi cela ne fonctionne pas. J'ai un module qui envoie une requête HTTP POST contenant une charge utile en utilisant le module natif nodejs http. Je stubbing la méthode de demande avec sinon et passer le flux PassThrough pour les flux de demande et de réponse.L'espion de rappel ne reçoit pas d'appel en fin de flux

DummyModule.js

const http = require('http'); 

module.exports = { 

    getStuff: function(arg1, arg2, cb) { 

     let request = http.request({}, function(response) { 

      let data = ''; 

      response.on('data', function(chunk) { 
       data += chunk; 
      }); 

      response.on('end', function() { 
       // spy should be called here 
       cb(null, "success"); 
      }); 

     }); 


     request.on('error', function(err) { 
      cb(err); 
     }); 

     // payload 
     request.write(JSON.stringify({some: "data"})); 
     request.end(); 
    } 

}; 

test_get_stuff.js

const sinon = require('sinon'); 
const http = require('http'); 
const PassThrough = require('stream').PassThrough; 

describe('DummyModule', function() { 

    let someModule, 
     stub; 

    beforeEach(function() { 
     someModule = require('./DummyModule'); 
    }); 

    describe('success', function() { 

     beforeEach(function() { 
      stub = sinon.stub(http, 'request'); 

     }); 

     afterEach(function() { 
      http.request.restore() 
     }); 

     it('should return success as string', function() { 
      let request = new PassThrough(), 
       response = new PassThrough(), 
       callback = sinon.spy(); 

      response.write('success'); 
      response.end(); 


      stub.callsArgWith(1, response).returns(request); 

      someModule.getStuff('arg1', 'arg2', callback); 

      sinon.assert.calledWith(callback, null, 'success'); 
     }); 
    }); 
}); 

L'espion ne soit pas appelé et le test échoue avec AssertError: expected spy to be called with arguments. Donc le response.on('end', ...) n'est pas appelé et donc l'échec du test. L'événement de fin sur le flux de réponse doit-il être déclenché d'une manière ou d'une autre?

Répondre

0

Cela fonctionne maintenant. Tout d'abord, les événements doivent être émis à l'aide de l'émission method. Deuxièmement, les événements doivent être émis juste après l'appel de la méthode someModule.getStuff (...):