2016-06-22 4 views
0

Ich versuche, Tests für meinen Code (einfache Version von dem, was ich unten testen möchte) zu schreiben, und verwenden Sie Sinon und Chai, um andere Dinge zu testen, aber tun Ich weiß nicht, wie ich meine Tests schreiben soll, um einen Serviceanruf zu simulieren, so dass ich Anrufe an externe Dienste vermeiden kann, aber simulierte Ergebnisse zurückbekommen, damit ich die Daten verarbeiten kann. Würde ich rewire verwenden (und wenn ja, wie würde das funktionieren)? Jede Hilfe wäre willkommen!Verwenden von Sinon zum Testen der Knotenfunktion ohne den Service-Aufruf innerhalb

qf = require('./service/queryFile'); 

function countByDate(req, res, next){ 
    //do stuff to create variable to pass to service call 
    var queryCriterion = { 
     d1 = req.query.d1, 
     d2 = req.query.d2 
    } 

    //make service call and process results 
    qf.getByDateAsync(queryCriterion) 
    .then(function(results){ 
     var data = {}; 
     //do some things with results data 
     data = results.data; 

     //return data object 
     res.json({ 
      success: true, 
      data: data, 
     }); 
    }); 
} 

module.exports = { 
    countByDate: countByDate 
}; 

**** Weitere Details ****

Die queryFile:

function getByDate(criterion){ 
    //query from database 
    //process results 
    return { 
     key1: aValue, 
     key2: bValue, 
     data: arrayOfObjects 
    }; 
} 

exports = module.exports = { 
    getByDate: getByDate, 
    getByDateAsync: Promise.promisify(getByDate) 
}; 

Der Test:

var pf = require('./service/processFile'); 
var qf = require('./service/queryFile'); 
var req, res; 

before(function(){ 
    this.timeout(30000); 
}); 

beforeEach(function(){ 
    res.json = sinon.spy(); 
    res.status = sinon.stub().returns({json: sinon.spy()}); 
}); 

describe('test', function(){ 
    it('should return results from countByDate', function(done){ 
     var eDate = new Date(); 
     var sDate = eDate.getDate()-60; 

     req = res = {}; 

     req.query = { 
      d1: sDate, 
      d2: eDate 
     }; 

     var testData = [{ 
      key1: '', 
      key2: '', 
      data: [{aKey: new Date(), count: 100}] 
     }]; 

     sinon.stub(qf, 'getByDateAsync').returns(Promise.resolve({data:tData})); 

     pf.countByDate(req,res); 

     console.log(res.json.data); 
} 

Antwort

0

ich queryFile in meinem Test erfordert hätte, und stoppte dann den getByDateAsync, indem er ein Versprechen mit einer verspotteten Antwort zurückgab.

const qf = require('./service/queryFile'); 

sinon.stub(qf, 'getByDateAsync').returns(Promise.resolve({ data: {}})); 
+0

Ich habe schon versucht, diese und der Test fehlschlägt, „vor jedem“ Haken einen Fehler zu erhalten ... Typeerror: Versuchte nicht definierte Eigenschaft getByDateAsync als Funktion zu wickeln. –

+0

Dann gibt Ihre qf-Datei diese Methode nicht frei, und Ihr Code wird überhaupt nicht ausgeführt. – jishi

+0

Einige Änderungen vorgenommen, und einige weitere Details hinzugefügt ... Fehler jetzt sagt mir, dass in dieser Zeile: qf.getByDateAsync (queryCriterion) TypeError: undefined ist keine Funktion –