这是我第一次尝试 Mocha/Chai 测试。使用 aws S3 在 mocha 中进行集成测试的最佳方法是什么。我尝试使用 aws-sdk-mock 和 sinon 来模拟 aws S3,但我真的不知道如何以及在哪里模拟这个?
这是我的代码:
// documentController
var aws = require('aws-sdk');
aws.config.update({
accessKeyId: process.env.AWS_ACCESS_KEY_ID,
secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
region: 'ap-southeast-1'
});
var s3 = new aws.S3({apiVersion: '2006-03-01'});
function deleteObject(key) {
s3.deleteObject({
'Bucket': 'delete-bucket',
'Key': key,
}, function(err, data) {
return
})
};
create: function(req, res) {
sails.async.auto(req, {
getDocumentContent: ['teamPrefDoc', 'getDocument', function (results, cb) {
var docKey = (
results.getDocument && results.getDocument.key
) ? results.getDocument.key : '';
var bucket = 'individual-docs';
if (!docKey || !bucket) {
return res.badRequest("Document doesn't have a key");
}
var params = {
Bucket: bucket,
Key: docKey
};
var tempDocStream = fs.createWriteStream(tempFileName + '.doc');
var s3Stream = s3.getObject(params).createReadStream();
s3Stream.pipe(tempDocStream).on('close', function() {
tempDocStream.close();
return cb(null, true);
}).on('error', function(err) {
sails.log(err);
return cb(null, false);
});
}],
'savePdfToS3': ['convertToPdfLocally', function (results, cb) {
if (!results.convertToPdfLocally) {
return cb(null, false)
}
var s3Key = results.documentDoc.key + '/pdf';
fs.readFile(tempFileName + '.pdf', (err, pdfBuffer) => {
if (err) { return cb(err); }
s3.putObject({
'Bucket': results.getDocumentContent,
'Key': s3Key,
'Body': pdfBuffer,
'ContentType': 'application/pdf'
}, function(err, data) {
if (err) { return cb(err); }
Documents.update({
id: id
}, {
pdf_key: s3Key
}).exec(function(err, updatedDocs) {
if (err) {
sails.log("Couldn't write pdf url to document", err);
return cb(err);
}
return cb(null, updatedDocs[0]);
});
})
});
}],
}
}
我有一个运行创建函数的 API,它运行一些数据库查询并将文档保存到 s3。所以,我想测试这个 API,但我不知道如何模拟 s3.getObject 和 s3.putObject。
这是我运行设置和拆卸连接的测试文件
// bootstrap.test.js
var sinon = require('sinon')
var AWSMock = require('aws-sdk-mock')
before(async () => {
const getObjectStub = AWS.S3.prototype.getObject = sinon.stub();
var s3 = new Aws.S3();
AWSMock.mock('S3', 'getObject', function(parmas,callback){
console.log("Callback received for getObject");
callback(null,'Success');
});
AWSMock.mock('S3', 'deleteObject', function(param,callback){
callback(null,{'s3deleteMarker': true
,'s3DeleteVersionId': 'VERSION ID'
,'s3DeletedImageSourceUid': 'SOURCE'
,'s3DeletedKey': 'KEY'});
});
这是我的测试代码:
// document.test.js
describe('document controller', () => {
it('should upload a doc', done => {
defaultDocument.resourceId = caseIds[0],
request(sails.hooks.http.app)
.post(`${apiVersion}/new/documents?app=test`)
.set('Authorization', `Bearer ${process.env.ACCESS_TOKEN}`)
.field(defaultDocument)
.attach('document0', 'some_pdf.pdf')
.expect(200)
.end((err, res)=> {
if(err) {
return done(err)
}
console.log(res.body)
done()
})
})
})
我对单元测试相当陌生,所以我很高兴你能指出我的任何方向:-)
非常感谢!