首页 文章

调用server.inject()POST请求不在Hapi.js中调用处理程序

提问于
浏览
1

我有一个像这样的Jasmine测试规范test_spec.js:

describe('my tests', () => {
  it('POST should return 201 created', () => {
    var req = {
      method: 'POST',
      url: '/api/v1.0/message',
      payload: JSON.stringify({name: 'Ethan'})
    };
    server.inject(req, res => {
      expect(res.statusCode).to.equal(201);
    });
  });
});

API调用的路由如下所示:

var routes = [{
  path: '/api/v1.0/message',
  method: 'POST',
  handler: function(request, reply) {
    reply('Success').created();
  }
}];
exports.register = function(server, options, next) {
  server.route(routes);
  next();
}

但是,当我运行测试时,不会调用此特定测试的 expect() 函数,因为 server.inject() 方法不会调用响应回调 . 事实上,甚至没有调用路由处理程序方法(我使用console.log语句检查) . 但是,当我更改请求方法和从POST到GET的路由时,它可以工作,测试按预期调用 expect() 方法 . 该测试仅适用于POST请求 . 我做错了吗?

1 回答

  • 2

    事实证明问题出在我的问题中发布的测试电话 describe() 片段中 . 我忽略了在 server.inject() 调用中调用 done() 函数 . 一旦我添加了,POST测试开始被调用:

    describe('my tests', () => {
      it('POST should return 201 created', (done) => {
        var req = {
          method: 'POST',
          url: '/api/v1.0/message',
          payload: JSON.stringify({name: 'Ethan'})
        };
        server.inject(req, res => {
          expect(res.statusCode).toEqual(201);
          done();
        });
      });
    });
    

    从Jasmine文档中调用 done() 回调的需求对我来说并不明显 . 调用是必要的,以便推迟规范完成,直到调用 done() (表示已发布有效负载) .

相关问题