存根mongoDB与hapijs

存根mongoDB与hapijs

问题描述:

我想弄清楚如何存根mongoDBhapi js允许测试,但我不知道如何做到这一点。我试过检查出Sinonjs,但我不知道如何在这个特殊情况下应用它。 下面是一些代码:存根mongoDB与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; 

这里的是路线:

// 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') 
}; 

和这里的测试套件:

// 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(); 
    }); 
    }); 
}); 

它的工作原理,但只有当有到数据库的连接我想解耦。任何帮助,将不胜感激。

这里是devinivy

一种方法解决礼貌我已经采取了,是把查询服务器方法,那么 存根在我的测试服务器的方法(server.methods.x = stubX)

您可能还检查了proxyquire通过timcosta

的建议下面是简要github discussion