为什么我的集成测试会在nodejs中等待异步Promise?

时间:2016-02-10 17:59:22

标签: javascript node.js asynchronous promise

我使用async.map使用ID合并来自db的数据。此外,我还将结果保存到redis中进行缓存,但看起来我的mocha测试等待Promise完成,即使我没有调用then,因为我认为它只会触发并忘记。我错过了什么吗?

这是代码。

    queries.query(druidQuery)
    .then(addDetails)
    .catch(function catchFunc(err) {
      return reply(Boom.badImplementation(err, {message: err}));
    });

    function addDetails(response) {
      async.map(response, addDetailsList, function mapFunc(err, output) {
        return reply({
          data: output,
          query: options
        });
      });
    }

    function addDetailsList(items, cb) {
      async.map(items.result, addDetailsItem, cb);
    }

    function addDetailsItem(item, cb) {
      crawler.crawl(item).then(function(results) {
        crawler.set(item, JSON.stringify(results));
        var crawlOut = _.extend(item, results);
        return cb(null, crawlOut);
      }).catch(function() {
        return cb(null, item);
      });
    }

只要我有这条线,我的测试就不会退出。

crawler.set(item, JSON.stringify(results));

这是该行的代码。

var sh = require('shorthash');
var bluebird = require('bluebird');
var redis = require('redis');

var config = require('../config');

bluebird.promisifyAll(redis.RedisClient.prototype);
bluebird.promisifyAll(redis.Multi.prototype);

    set: function set(url, contents) {
        var redisClient = redis.createClient({
          host: config.redis.url,
          port: config.redis.port
        });

        var urlHash = sh.unique(url);
        return redisClient.setAsync(urlHash, contents);
      },

如果我将这一行排除在crawler.set(item, JSON.stringify(results));后,我的测试将在完成之后退出。

更新

describe('/', function postsDesc() {
    after(function after(done) {
      server.stop({timeout: 5000}, function err(errorResponse) {
        if(errorResponse) {
          throw errorResponse;
        }
        done();
      });
    });

    it('should get analytics posts with from date', function it(done) {
      var url = '/';

      server.inject(url, function injectResponse(response) {
        expect(response.statusCode).to.equal(200);
        done();
      });
    });
}

0 个答案:

没有答案