hapijs 测试发现 server.inject 错误

hapijs testing with server.inject error catched

我正在尝试使用 server.inject

测试 hapijs
/// <reference path="../../typings/index.d.ts" />
import * as chai from "chai";
let assert = chai.assert;

import server from "../../src/server";
import UserController from '../../src/controllers/userController';
import UserRepository from '../../src/libs/repository/mongo/userRepository';
import {IUser, IUserActivation, IUserCreate} from "../../src/libs/repository/interfaces";

describe("routes/user", function() {

  const userController = new UserController(server, new UserRepository());

  // ========================== [ ACTIVATE ] ==========================
  it.only("/activate: should activate a user", function(done) {
    let user: IUserActivation = {
      '_id': '1234566737465',
      'token': '123234523542345'
    };

    let url = '/api/users/' + user._id + '/' + user.token;
    const request = {
      method: 'PUT',
      url: url,
      payload: user
    };

    server.inject(request).then((response) => {
      let res = JSON.parse(response.payload);
      //assert.strictEqual(res.success, true, '/users/{id}/{token}')
      chai.expect(res.success).to.deep.equal(false);
      chai.expect(res.success).to.deep.equal(true);
      done();
    }).catch((error) => {
      console.log(error.message);
    });
  });
});

response.success 属性为真。所以通常测试应该失败,因为 chai.expect(res.success).to.deep.equal(false);.

但测试失败并显示消息:Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test.

删除 catch 子句时,它也会因超时错误而失败。

如果我将 done() 添加到 catch 子句的末尾,则测试通过。这是错误的行为,因为测试应该会失败。

我该怎么做才能获得预期的行为?提前致谢。

问题是 server.inject return 是一个承诺。只要您使用最新版本的 Mocha,它就可以处理,但您无需担心调用 done() 而是 return server.inject。

describe("routes/user", function() {

    const userController = new UserController(server, new UserRepository());

    // ========================== [ ACTIVATE ] ==========================
    it.only("/activate: should activate a user", function() { //No done needed
        let user: IUserActivation = {
            '_id': '1234566737465',
            'token': '123234523542345'
        };

        let url = '/api/users/' + user._id + '/' + user.token;
        const request = {
            method: 'PUT',
            url: url,
            payload: user
        };

        //Return the promise
        return server.inject(request).then((response) => {
            let res = JSON.parse(response.payload);
            //assert.strictEqual(res.success, true, '/users/{id}/{token}')
            chai.expect(res.success).to.deep.equal(false);
            chai.expect(res.success).to.deep.equal(true);
        }); //No catch needed.
    });
});