Stubbing S3在Node.js中上传

我将如何去在S3中上传Node.js中的S3上传文件?

对于洞察力,我使用摩卡进行testing,Sinon进行testing,但我愿意改变任何事情。 我有一个文件,导出执行上传的函数。 它看起来像这样:

var AWS = require('aws-sdk'); var s3 = new AWS.S3({ params: { Bucket: process.env.S3_BUCKET }}); var params = { Key: key, Body: body }; s3.upload(params, function (error, data) { // Handle upload or error }); 

如果我尝试存根AWS.S3AWS.S3.prototype ,没有任何更改。 我认为这是因为我的testing需要aws-sdk自己,并有自己的每个函数的副本。

我的testing看起来像这样:

 describe('POST /files', function () { var url = baseURL + '/files'; it('uploads the file to s3', function (done) { var fs = require('fs'); var formData = { video: fs.createReadStream(process.cwd() + '/test/support/video.mp4') }; var params = {url: url, formData: formData}; request.post(params, function (error, response, body) { expect(response.statusCode).to.eq(200); expect(response.body).to.eq('Uploaded'); done(); }); }); }); 

这个testing可以正常工作,但是它不会将上传存储到S3,所以上传实际上是通过:X。

如果您愿意,可以按如下方式与Sinon.js进行存根:

  1. 公开AWS.S3实例:

     var AWS = require('aws-sdk'); var s3 = new AWS.S3({ params: { Bucket: process.env.S3_BUCKET }}); var params = { Key: key, Body: body }; exports.s3.upload(params, function (error, data) { }); //Expose S3 instance exports.s3 = s3; 
  2. 存根相同的实例如下所示:

     var sinon = require('sinon'); //Import module you are going to test var UploadService = require('./uploadService'); describe('POST /files', function () { before(function() { //Stub before, and specify what data you'd like in the callback. this.uploadS3Stub = sinon.stub(uploadService.s3, 'upload').callsArgWith(1, null, { data: 'Desired response' }); }); after(function() { //Restore after this.uploadS3Stub.restore(); }); var url = baseURL + '/files'; it('uploads the file to s3', function (done) { var fs = require('fs'); var formData = { video: fs.createReadStream(process.cwd() + '/test/support/video.mp4') }; var params = {url: url, formData: formData}; var self = this; request.post(params, function (error, response, body) { expect(response.statusCode).to.eq(200); expect(response.body).to.eq('Uploaded'); //You can also check whether the stub was called :) expect(self.uploadS3Stub.calledOnce).to.eql(true); done(); }); }); }); 

您需要使用sinon创build存根,并用存根replace正在testing的代码中的variables。 有几个模块可以做到这一点,试试Mockery或Rewire 。 例如,使用Rewire加载你正在使用__set__testing的模块,而不是require然后使用__set__来设置variables。

 var rewire = require('rewire'); var moduleUnderTest = rewire('myModule'); moduleUnderTest.__set__('s3', stubbedS3); 

在Node中有几个选项来模拟S3。

一些特定于S3的模块:

一般AWS模拟的一些模块:

你甚至可以启动一个响应S3 API调用的简单服务器:

最后一个可以很容易地用于其他语言和运行时,不仅在Node中。