2017-10-14 5 views
1

J'essaye de comprendre comment talonner mongoDB dans hapi js pour permettre le test mais je n'ai aucune idée comment le faire. J'ai essayé de vérifier Sinonjs mais je n'ai aucune idée de comment l'appliquer dans ce cas particulier. est ici une partie du code:Stub mongoDB avec hapijs

// index.js 
'use strict'; 

const Hapi = require('hapi'); 
const MongoJS = require('mongojs'); 

const server = new Hapi.Server(); 

server.connection({ host: 'localhost', port: 11001 }); 

server.app.db = MongoJS('crunchbase', ['companies']); 

server.register([ 
    { 
    register: require('./lib/plugins') 
    }, 
    { 
    register: require('./lib/modules/companies'), 
    options: { 
     baseUrl: '/v1/companies' 
    } 
    } 
], (err) => { 

    if (err) { 
    throw err; 
    } 

    server.start((err) => { 

    if (err) { 
     throw err; 
    } 
    server.log('info', `Server listening on ${server.info.uri}`); 
    }); 
}); 

module.exports = server; 

Voici ce sont les routes:

// companies.js 
'use strict'; 

const Boom = require('boom'); 
const Joi = require('joi'); 

const error = Joi.object().keys({ 
    statusCode: Joi.number(), 
    error: Joi.string(), 
    message: Joi.string() 
}); 

const schema = Joi.object().keys({ 
    _id: Joi.object(), 
    permalink: Joi.string(), 
    name: Joi.string(), 
    homepage_url: Joi.string(), 
    category_list: Joi.string(), 
    funding_total_usd: Joi.alternatives().try(Joi.number(), Joi.string()), 
    status: Joi.string(), 
    country_code: Joi.string().allow(''), 
    state_code: Joi.alternatives().try(Joi.string(), Joi.number()).allow(''), 
    region: Joi.string().allow(''), 
    city: Joi.string().allow(''), 
    funding_rounds: Joi.number(), 
    founded_at: Joi.string().allow(''), 
    first_funding_at: Joi.string(), 
    last_funding_at: Joi.string() 
}); 

exports.register = (server, options, next) => { 

    const db = server.app.db; 
    const { baseUrl } = options; 

    server.route([ 
    { 
     method: 'GET', 
     path: baseUrl, 
     config: { 
     description: 'companies', 
     notes: 'Get a list of companies from the database', 
     tags: ['api'], 
     validate: { 
      query: { 
      limit: Joi.number().min(1).max(20).default(5) 
      } 
     }, 
     response: { 
      status: { 
      200: Joi.array().items(schema), 
      400: error, 
      500: error 
      } 
     } 
     }, 
     handler: (request, reply) => { 

     db.companies.find().limit(request.query.limit, (err, docs) => { 

      if (err) { 
      return reply(Boom.wrap(err, 'Internal MongoDB error.')); 
      } 
      reply(docs); 
     }); 
     } 
    } 
    ]); 

    return next(); 
}; 

exports.register.attributes = { 
    pkg: require('./package.json') 
}; 

Et voici la suite de tests:

// companies.test.js 
'use strict'; 

const Code = require('code'); 
const Lab = require('lab'); 

const lab = exports.lab = Lab.script(); 
const { describe, it } = lab; 
const expect = Code.expect; 

const Server = require('../../'); 

describe('Companies module test suite',() => { 

    const baseUrl = '/v1/companies'; 

    it('should return array of 5 companies by default', (done) => { 

    Server.inject({ 
     method: 'GET', 
     url: baseUrl 
    }, (response) => { 

     expect(response.statusCode).to.equal(200); 
     expect(response.result).to.be.an.array().and.have.length(5); 
     done(); 
    }); 
    }); 

    it('should return array of 3 companies', (done) => { 

    Server.inject({ 
     method: 'GET', 
     url: baseUrl + '?limit=3' 
    }, (response) => { 

     expect(response.statusCode).to.equal(200); 
     expect(response.result).to.be.an.array().and.have.length(3); 
     done(); 
    }); 
    }); 

    it('should throw an error', (done) => { 

    Server.inject({ 
     method: 'GET', 
     url: baseUrl + '?limit=me' 
    }, (response) => { 

     expect(response.statusCode).to.equal(400); 
     expect(response.result.error).to.equal('Bad Request'); 
     done(); 
    }); 
    }); 
}); 

Il fonctionne mais seulement s'il y a une connexion à la DB que je veux découpler. Toute aide serait appréciée.

Répondre

0

Voici une solution avec l'aimable autorisation de devinivy

Une approche que j'ai pris est de placer les requêtes dans les méthodes de serveur, puis stub les méthodes de serveur (server.methods.x = stubX) dans mes tests.

Vous pouvez également consulter proxyquire comme suggéré par timcosta

Voici le bref github discussion