我使用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();
});
});
}