【问题标题】:Calling server.inject() POST request not calling handler in Hapi.js调用 server.inject() POST 请求不调用 Hapi.js 中的处理程序
【发布时间】:2016-07-28 01:19:42
【问题描述】:

我有一个这样的 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 请求。我做错了吗?

【问题讨论】:

  • 您能否制作一个完整的可运行示例(如果它很大,请从您的应用中提取)而不是 sn-ps?
  • 我结合了路由定义和路由处理程序来简化代码。如果我还要在这里粘贴 Hapi 样板代码,它会变得笨拙。为了复制这一点,基本上只需要一个 Hapi 样板并插入上述路由 + 处理程序。然后编写上面的Jasmine测试,在终端通过jasmine命令执行。
  • 我不同意。如果您提供一个我们可以运行的最小工作示例,它会更容易提供帮助。我不能对上述内容做太多,因为它看起来不错。您的问题可能不在您提供的范围内。
  • 你是对的。我花时间生成绝对最小的示例并且它在那里工作,所以这必须与代码中的其他内容相关联。很奇怪。当我发现它是什么时,我会在这里报告,以防它可以帮助其他人。谢谢!

标签: testing hapijs


【解决方案1】:

原来问题出在我的问题中发布的测试电话describe()sn-p 中。我忽略了在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()(意味着已发布有效负载)。

【讨论】:

  • 在调用响应回调时我总是使用“返回回复”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-26
  • 2016-08-04
相关资源
最近更新 更多