将SuperAgent +承诺摩卡测试超时,而不是失败,并“期待”(Mocha tests usin

2019-09-28 13:19发布

我使用的是mocha运行大量的集成测试针对外部Web服务。 我用superagent-promise的请求/响应处理,以及我用expect作为我的说法的库。

对于其中的一些测试,我需要链大量请求在一起,所以承诺非常有帮助。 但是我注意到我的测试,现在超时(并没有错误消息)失败而不是错误消息本身。 作为一个简单的例子:

  it('[MESSAGES-1] cannot be posted without an auth token', function(done) {
    agent.post(config.webRoot + '/rooms/ABC/messages').send({
      content: 'This is a test!'
    }).end().then(function(res) {
      // Not expected
    }, function(err) {
      expect(err.status).toBe(401)
      done()
    })
  })

按预期工作并通过:

  Messages
    ✓ [MESSAGES-1] cannot be posted without an auth token

但是 ,如果我改变我的说法,期待一个不同的状态代码:

expect(err.status).toBe(200) // This should fail

那么测试失败,超时!

  1) Messages [MESSAGES-1] cannot be posted without an auth token:
     Error: timeout of 1000ms exceeded. Ensure the done() callback is being called in this test.

这是个常见的问题吗? 有一种解决方法或者调整我可以做? 我不想失去使用承诺的能力。

Answer 1:

这是一个已知的问题?

这实际上不是一个问题。

问题是, expect(err.status).toBe(200)抛出吞下内部的错误.then和这将导致代码永远不会达到done() 。 你应该重构你的代码为以下内容:

it('[MESSAGES-1] cannot be posted without an auth token', function(done) {
    agent.post(config.webRoot + '/rooms/ABC/messages').send({
      content: 'This is a test!'
    }).end()

    .then(function(res) {
      // Not expected
    }, function(err) {
      expect(err.status).toBe(401)
      done()
    })
    .catch(function(err) {
        done(err); //report error thrown in .then
    })
  })

这样,您就能够捕获并报告由引发错误expect(err.status).toBe(200)



Answer 2:

在你的情况发生超时becouse的完成回调永远不会被调用,要么是因为HTTP请求didnt失败,或者期望未能所以它抛出assertation错误。

摩卡适当处理(承诺返回)异步测试,所以不要使用完成回调,当诺言混合会引起混乱。 返回的承诺,而不是:

it('[MESSAGES-1] cannot be posted without an auth token', function() {
  return agent.post(config.webRoot + '/rooms/ABC/messages').send({
    content: 'This is a test!'
  }).end().then(function(res) {
    // here you must throw an error, because if the post didnt fail somehow, the test would be green because of no assertations and no promise rejection.
    throw new Error("Not expected");
  }, function(err) {
    expect(err.status).toBe(401);
  });
});


文章来源: Mocha tests using superagent + promises timeout rather than fail with 'expect'