摩卡柴测试通过但不应该

时间:2017-08-23 11:08:54

标签: mocha chai

这是目前的测试:

  describe('/POST Register Page', function() {
    it('it should register new user', function(/*done*/) {
      chai.request(server)
        .post('/auth/register')
        .send(new_user_data)
        .end(function(res) {
          expect(res).to.have.status(2017);
          // done();
        })
    })
  })

我检查过的最后一个,没有http代码2017,但它仍然通过:

Registration
    Get register page
GET /auth/register 200 6.989 ms - 27
      ✓ it should get register page
    /POST Register Page
      ✓ it should register new user


  2 passing (147ms)

我想发布一些内容,然后回复一下,然后回复一下。

如果我包含done(),我会收到超时错误:

1) Registration /POST Register Page it should register new user:
     Error: Timeout of 3000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我无法得到任何工作,无论是错还是正确,测试都会通过。

虽然此get请求按预期传递:

  describe('Get register page', function() {
    it('it should get register page', function(done) {
      chai.request(server)
        .get('/auth/register')
        .end(function(err, res) {
          expect(err).to.be.null;
          expect(res).to.have.status(200);
          done();
        })
    })
  })

我是mocha-chai-chai-http的新手,到目前为止的经验很奇怪。

感谢。

1 个答案:

答案 0 :(得分:1)

您的POST请求可能需要超过3秒才能完成,因此mocha会抛出超时错误。

您可以尝试将超时设置为更大的值,如:

describe('/POST Register Page', function() {
  // timeout in milliseconds
  this.timeout(15000); 

  // test case
  it('it should register new user', function(done) {
    chai.request(server)
      .post('/auth/register')
      .send(new_user_data)
      .end(function(res) {
        expect(res).to.have.status(200);
        done();
      })
  })
})

通过一些试验,您可以找出在测试中设置的最佳超时值。

当您不使用done()回调时,mocha只是跳过断言而不等待实际响应到达。由于.end()块中的断言永远不会被执行,因此mocha在没有断言的情况下通过了测试。当我第一次开始使用TDD时,我遇到了类似的问题,我从中学到了很难的方法。

Reference

  

因为end函数被传递回调,所以运行断言   异步。因此,必须使用一种机制来通知   测试回调已完成的框架。否则,测试   将在检查断言之前通过。