没有setTimeout,使用elasticsearch的后端测试失败

时间:2017-05-25 08:14:21

标签: elasticsearch mocha supertest

我正在编写使用MongoDB和Elasticsearch的后端测试。问题是如果没有使用setTimeout测试的包装测试失败,并且看起来弹性搜索在测试之前无法将模拟数据索引到数据库中。这是代码:

let elasticSearch = require('elasticsearch');
let elasticClient = new elasticSearch.Client({
  host: 'localhost:9200'
});
let app = require('./dist/app'); //path to my application
let supertest = require('supertest');

before((done) => {
  elasticClient.index(elasticMockData, function() {
    done();
  });
});

beforeEach(() => {
  request = supertest(app);
});

it('should get data from elastic', () => {
  setTimeout(() => { // if I comment this timeout, test will fail
    request.get('/api/elastic')
           .end((err, res) => {
             expect(res.body.hits.hits.length).not.to.equal(0);
           })
  }, 1000); // if I comment this timeout, test will fail
});

我认为你会同意超时不是一个优雅而好的解决方案,它会将每个测试减慢到1秒或更长时间。也许,我错过了什么?

1 个答案:

答案 0 :(得分:1)

找到解决方案,也许对某人有用。 根据{{​​3}}:

  

默认情况下,文档可立即用于get()操作,但只能在索引刷新后进行搜索(可以自动或手动进行)。

因此,在这种情况下,done()应该在另一个回调函数中调用:

before((done) => {
  elasticClient.index(elasticMockData, function() {
     elasticClient.indices.refresh(function (err: any, res: any) {
        if (err) {
          return;
        }
        done();
     });
  });
});