在Node.js单元测试中使用Mocha处理不同的响应

时间:2018-06-28 13:48:46

标签: javascript node.js unit-testing testing mocha

当我传递正确的passed信息时,我的测试得到200 status codeheader)。但是当我尝试使用wrong info400 status code)时,它无法处理该错误,

这是我的代码,(此处我传递了错误的标题信息,因此响应将是状态为400的代码)

const chai = require('chai');
const expect = require('chai').expect;
const chaiHttp = require('chai-http');
chai.use(chaiHttp);
const main  = require('../server');
let token;
describe('GET USER', function()  {
  this.timeout(50000);
  it('Display info about user and returns a 200 response', (done) => {
    chai.request(main)
    .get('/users')
    .set("Authorization"," ")
    .then(function(response) {
      // Now let's check our response
      expect(response).to.have.status(200);
      done();
    })
    .catch((err)=>{
      expect(err.status).to.be.equal(400)
      done();
    })
  });
});

出现这样的错误,

GET USER
(node:28390) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected undefined to equal 400
    1) Display info about user and returns a 200 response

  1 failing

  1) GET USER
       Display info about user and returns a 200 response:
     Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/test/users.test.js)

2 个答案:

答案 0 :(得分:1)

这里似乎有一个小小的误解:如果catch收到HTTP错误,则不会执行chai-http。如果请求失败,则执行该命令。获取200400都应在then中进行测试,而不是被抓住。

从错误消息中可以看到,err对象没有status字段,因为它不是response对象,而是Error的实例。 / p>

答案 1 :(得分:1)

如另一个答案中所述,您不能同时测试200和400。

如果断言失败,则在done()之前调用expect会导致测试超时,因为它会引发断言错误并且永远不会调用done。这会导致无法处理的拒绝,因为catch之后没有其他catch

chai-http supports promise control flow。 Mocha很自然地处理了Promise,测试应该返回Promise,而不是使用done。由于是suggested,因此错误响应可以达到err.response。可能应该是:

describe('GET USER', function()  {
  it('should returns 400 response', () => {
    return chai.request(main)
    .get('/users')
    .set("Invalid header"," ")
    .catch(function(err) {
      expect(err.response.status).to.have.status(400);
    });
  });
});