使用SocketIO和Express进行节点mocha API测试

时间:2017-06-27 02:00:21

标签: node.js sockets express mocha chai

我正在开发一个项目,我需要向API提供HTTP请求并处理通过套接字相互通信的用户(我正在使用Socket.io)。我的server.js文件的代码如下:

    let initHttpServer = () => {
        app.use(bodyParser.urlencoded({ extended: true }));
        app.use(bodyParser.json());
        app.use(require('./routes'));
        app.get('/config.js', function(req,res) { res.write("var ROOT_URL='"+process.env.ROOT_URL+"'" + '\n'); res.end(); });
        http.listen(port, function() {
            console.log('express listening on port' + port);
            console.log('a user connected');
        });
        return app;
    }
.
.
.
conn.once('open', function() {
    initHttpServer();
});
module.exports = initHttpServer;

我也有一个io.on('connect'...)函数,但为了简洁起见,我不会在这里发布(至少还有)。 当我使用Postman进行测试时它工作正常,但是我在使用mocha和Chai测试HTTP端点时遇到了麻烦。我现在要测试的代码如下:

chai.use(chaiHttp);

it('should get votes', function(done) { // <= Pass in done callback
  chai.request('http://localhost:3000')
  .get('/vote')
  .then(function(res) {
    res.should.have.status(200);
  })
  .catch(function(err) {
    throw err;
  });
});

当我运行npm test时,我收到以下错误:

  Error: Timeout of 10000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.

我已经尝试将我的测试函数放在try / catch块中,如下所示:

  it('should return all votes on /votes', function(done) {
    try{ 
      chai.request('http://127.0.0.1:3000')
      .get('/vote')
      .end(function(req,res) {
        res.should.have.status(787432189700);
        done();
      });
      --> done();
    } catch(error) {
      done(error);
    }
  });

如果我采取完成();我用箭头指示的电话( - &gt;),我得到了上述错误,但如果我保留它,它只会返回成功,而不会测试任何东西。我假设它是一个异步调用,所以在测试完成之前调用done()。因此,我不知道如何进行。我该怎么做才能测试API端点?

谢谢!

1 个答案:

答案 0 :(得分:0)

首先:

您的try / catch块无效,您正在进行异步调用。

第二

最有可能是在这一行:res.should.have.status(787432189700);出现错误,因此已完成未执行。

尝试这样的事情:

let chai = require('chai')
  , chaiHttp = require('chai-http');
const expect = require('chai').expect;

chai.use(chaiHttp);

describe('Some test', () => {
    it('Lets see', (done) => {
        chai.request('http://localhost:3000')
            .get('/vote')
            .end(function (err, res) {    
                expect(err).to.be.null;
                expect(res).to.have.status(200);
                done();
            });
    });
});

请注意回调函数的第一个参数是错误