2017-04-12 2 views
0

Supposons que j'ai un point de terminaison POST /user/:id et que ce point d'extrémité appelle en interne une fonction getUserData(id), puis renvoie le résultat à l'appelant qui, à son tour, renvoie la sortie, après JSON.stringify() ing.Mocha, Chai & Sinon: Vérification du fonctionnement interne d'une API

Maintenant, je dois m'assurer que getUserData(id) est appelé, au moins une fois. Comment puis-je copier/espionner la fonction getUserData(id), lorsque j'utilise chai-http pour envoyer une demande de publication au serveur? Est-ce même une approche correcte?

+0

habituellement vous suffit d'inclure le contrôleur un test séparé et espionner, stub & moquer les choses afin que vous puissiez tester le contrôleur. Le test de l'API est moins complexe, il suffit d'envoyer une requête et d'exécuter le test sur le résultat. Jetez un oeil à la documentation officielle, il devrait fournir suffisamment d'informations pour écrire le test. – Gntem

Répondre

0

J'ai adapté le tutoriel de https://scotch.io/tutorials/test-a-node-restful-api-with-mocha-and-chai à un barebones server et test que vous pouvez utiliser pour faire un test API de base. Comme l'a dit Mr.Phoenix, vous n'avez pas besoin d'entrer dans les détails de votre handler, il vous suffit de transmettre des données à votre terminal et de vérifier le résultat par rapport à ce que vous attendez.

Voici 2 fichiers que vous pouvez utiliser pour faire ce test:

index.js

const express = require('express') 
const app = express() 



app.get('/material',(req, res)=>{ 
    res.json([]) 
    //res.json(['stone', 'wood']) 
}) 

function getUserData(id){ 
    return 42 
} 

const port = 3031 

app.listen(port, function(err){ 
    console.log("Listening on port: " + port) 
}) 
module.exports = app 

test.js

process.env.NODE_ENV = 'test' 
// const Material = require('./materials') // conroller 
const chai = require('chai') 
const chaiHttp = require('chai-http') 
const server = require('./index') 
const should = chai.should() 


chai.use(chaiHttp) 



describe('/GET material',() => { 
    it('it should get all the materials', (done)=>{ 
    chai.request(server) 
    .get('/material') 
    .end((err, res) => { 
     res.should.have.status(200) 
     res.body.should.be.a('array') 
     res.body.length.should.be.eql(0) // start empty 
     done() 
    }) 
    }) 
}) 
+0

Merci, mais si je veux entrer dans le Nitty Gritty? J'écris des tests séparés pour le contrôleur, comme suggéré par @ Mr.Phoenix –