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.S3
或AWS.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进行存根:
-
公开
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;
-
存根相同的实例如下所示:
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模拟的一些模块:
- https://www.npmjs.com/package/aws-sdk-mock
- https://www.npmjs.com/package/mock-aws-sinon
- https://www.npmjs.com/package/mock-aws
你甚至可以启动一个响应S3 API调用的简单服务器:
最后一个可以很容易地用于其他语言和运行时,不仅在Node中。