sinon - 如何在Hapi/Lab测试中使用Sinon来消除knex调用?

标签 sinon hapi.js knex.js bookshelf.js lab

我正在尝试为新的 Hapi 应用程序设置测试模式。我过去曾在 Express 中使用过 Mocha 和 Chai,但我正在尝试使用 Lab 和 Code 来留在 Hapi 生态系统中。我还使用 Bookshelf 和 Knex 来处理数据库交互。

所以我想测试一个简单的健康端点。

'use strict';

const controller = require('../controller/healthController');

module.exports = [
  {
    method: 'GET',
    path: '/health',
    config: {
      handler: controller.health,
      description: 'The health endpoint returns 200',
      tags: ['api', 'health']
    }
  }
];

在处理程序中,它只是执行快速查询以确保它可以连接到数据库。

'use strict';

const bookshelf = require('../config/db');
const knex = bookshelf.knex;

module.exports = {
  health: function (request, reply) {
    knex.raw('SELECT version()').then(() => {
      reply('service is running');
    }).catch((err) => {
      reply({err: err, code: 500});
    });
  }
};

据我了解,需要服务器然后使用 server.inject 实际上并没有启动服务器,所以我不相信我应该有一个数据库连接,这意味着我应该将它模拟出来数据库调用。对我来说奇怪的是这个测试通过了:

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

const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.test;
const expect = Code.expect;
const before = lab.before;

let server;

describe('health controller', () => {

  before((done) => {
    server = require('../../server');
    done();
  });

  it('health check replies 200 when successful call to db', (done) => {

    const options = {
      method: 'GET',
      url: '/health'
    };

    server.inject(options, (res) => {
      expect(res.payload).to.include('is running');
      expect(res.statusCode).to.equal(200);

      done();
    });

  });

});

所以我有两个问题。首先,我觉得上面的测试不应该真正通过。除非它加载所有内容并因此连接到我想的数据库。也许我应该只测试 Controller /处理程序方法?但我还没有找到任何这样的例子。

其次,无论如何,我都尝试停止 knex.raw 调用,当我尝试像下面那样执行此操作时,我收到 500 错误。

'use strict';
const Code = require('code');
const Lab = require('lab');
const Sinon = require('sinon');

const lab = exports.lab = Lab.script();
const describe = lab.describe;
const it = lab.test;
const expect = Code.expect;
const before = lab.before;

let server;
let knex = require('../../app/config/db').knex;

describe('health controller', () => {

  before((done) => {
    server = require('../../server');
    done();
  });

  it('health check replies 200 when successful call to db', (done) => {

    const stub = Sinon.stub(knex, 'raw').returns({});

    const options = {
      method: 'GET',
      url: '/health'
    };

    server.inject(options, (res) => {
      expect(res.payload).to.include('is running');
      expect(res.statusCode).to.equal(200);
      expect(stub.calledOnce).to.be.true();
      done();
    });

  });

});

我不太确定为什么会发生这种情况。

最佳答案

我认为Sinon.stub(knex, 'raw').resolves({});是一个更好的解决方案

关于sinon - 如何在Hapi/Lab测试中使用Sinon来消除knex调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704779/

相关文章:

angularjs - Sinon 在测试中 stub AngularJS 服务

node.js - 如何测试 API 端点是否存在可由多个代码路径触发的错误路径?

hapi.js - 如何在 Hapi 上设置 statusCode 和特定消息 ^18

node.js - HapiJS 代理问题

javascript - Knex.js 查询中 Runner 未定义

node.js - 将 Sinon SinonStubbedInstance 与 Typescript 一起使用

javascript - 如何使用 hapi.js 在同一台服务器上支持多个网站?

node.js - Knex 与 Heroku Postgres 连接时出错?

node.js - 使用迁移 API 时 Knex 迁移不起作用

javascript - 如何让Sinon.JS callCount 递增