首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带有hapijs的存根mongoDB

带有hapijs的存根mongoDB
EN

Stack Overflow用户
提问于 2017-10-14 16:42:20
回答 1查看 202关注 0票数 1

我试图弄清楚如何在hapi js中存根mongoDB以便进行测试,但我不知道该怎么做。我试过查看Sinonjs,但我不知道如何在这种特殊情况下应用它。下面是一些代码:

代码语言:javascript
复制
// 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;

以下是路由:

代码语言:javascript
复制
// 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')
};

下面是测试套件:

代码语言:javascript
复制
// 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();
    });
  });
});

它可以工作,但前提是要与我想要解耦的数据库建立连接。任何帮助都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2017-10-17 05:15:21

这是一个由devinivy提供的解决方案

我采取的一种方法是将查询放在服务器方法中,然后在我的测试中清除服务器方法的(server.methods.x = stubX)

您还可以按照timcosta的建议查看proxyquire

下面是简要的github discussion

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46742600

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档