【发布时间】:2015-10-11 02:33:20
【问题描述】:
我想测试这段代码:
'use strict';
var Promise = require('bluebird');
var AWS = require('aws-sdk');
var fs = Promise.promisifyAll(require('fs-extra'));
var path = require('path');
var dispatcher = function() {
return {
/**
* @param {Object} options
* @param {string} options.s3_access_key
* @param {string} options.s3_secret_key
* @param {string} options.s3_bucket
* @param {string} options.file - Path to the file to be uploaded
* @param {string} [options.file_key] - Name to save the file under, defaults to the original file's name
* @returns {Function} Promise - A promise resolved with `true` or rejected with an Error
*/
upload: Promise.method(function upload(options) {
var s3_options = {
accessKeyId: options.s3_access_key,
secretAccessKey: options.s3_secret_key,
params: {
Bucket: options.s3_bucket
}
};
var file_stream = fs.createReadStream(options.file);
var file_key = options.file_key || path.basename(options.file);
var promisedS3 = Promise.promisifyAll(new AWS.S3(s3_options));
return promisedS3.putObjectAsync({
Body: file_stream,
Key: file_key
});
})
};
};
module.exports = {
create: dispatcher
};
我知道如何进行集成测试,但我还想验证 promisedS3 是否使用正确的参数被调用。我认为我需要为此使用间谍,但我不确定如何将自己“插入”到来自测试的 promiseS3.putObjectAsync 以拦截参数并进行比较。
我想避免将对 S3 的调用包装在私有方法中并继续使用工厂。
【问题讨论】:
-
你考虑过使用 sinon 吗?
-
我有,但我不确定我是否完全理解如何从我的代码中利用
promisedS3对象。我可以var spy = sinon.spy(require('./dispatcher'), 'upload');,但我看不出它如何帮助我监视promisedS3.putObjectAsync电话。 -
请在对象原型上调用
promisifyAll,而不是在每个新实例上调用 - 它会明显更快。 -
@BenjaminGruenbaum,如果我这样做
Promise.promisifyAll(AWS.S3),它将无法正常工作:TypeError: Cannot promisify an API that has normal methods with 'Async'-suffix See http://goo.gl/iWrZbw
标签: node.js testing promise mocha.js chai