簡體   English   中英

如何使用 sinon 模擬 AWS S3 getObject

[英]How to mock AWS S3 getObject with sinon

我正在嘗試對從存儲桶返回 S3 對象的 restify 路由進行單元測試

我的路線是:

 module.exports = function(server) { server.get('/configs/:version', (req, res, next) => { const s3 = new AWS.S3(); const params = { Bucket: 'testBucket', Key: 'testKey' }; function send(data, next) { res.setHeader('Content-Type', 'text/plain'); res.setHeader('Cache-Control', 'no-cache'); res.status(200); res.send(data.Body); next(); } s3.getObject(params, (err, data) => (err) ? next(err) : send(data, next)); }); };

對於我的單元測試,我一直在嘗試模擬 S3 構造函數,這樣我就可以存根getObject並慘遭失敗。

 describe('#configs', () => { let req; let res; let next; let server; let config; let AWS; let S3; let route; beforeEach(() => { req = { params: { version: 'testVersion' } }; res = { send: sinon.spy(), }; next = sinon.spy(); server = { get: sinon.stub(), }; config = { get: sinon.stub(), } AWS = () => { return { S3: () => { return { getObject: sinon.stub() } } } } route = proxyquire(process.cwd() + '/lib/routes/configs/get', { 'configs.js': config, 'aws-sdk': AWS, }); route(server); }); describe('#GET', () => { it('Should register configs get route', () => { let s3 = sinon.createStubInstance(AWS.S3, { getObject: sinon.stub(), }); server.get.callArgWith(1, req, res, next); expect(server.get).calledOnce.calledWith('/configs/:version'); expect(s3.getObject).calledOnce.calledWith({ Bucket: 'testBucket', Key: 'testKey' }); }); }); });

但是我收到這個錯誤: TypeError: undefined is not a spy or a call to a spy! 在 getObject 方法上。 一遍又一遍地閱讀 sinon 文檔后,我無法理解如何模擬構造函數,如何存根 getObject 方法,以便確保它被正確調用並返回,因此我知道它的響應得到了正確處理 有人可以幫忙嗎我用這個?

終於讓我的模擬工作了,問題是我將 AWS 模擬為一個沒有對象的函數,需要將 S3 模擬為一個函數,因為需要實例化的是 S3。 模擬應該是這樣的:

function S3() { 
  return s3;
}

s3 = {
  getObject: sinon.stub(),
  putObject: sinon.stub()
};

AWS = {
  config: {
    update: sinon.stub()
  },
  S3: S3
};

像這樣,如果需要模擬 putObject,他只需要執行以下操作: s3.putObject.callsArgWith(1, err, data);

const getObjectStub = AWS.S3.prototype.getObject = Sinon.stub();
    getObjectStub.yields(null, {
    AcceptRanges: "bytes", 
    ContentLength: 3191, 
    ContentType: "image/jpeg", 
    Metadata: {
    }, 
    TagCount: 2, 
    VersionId: "null"
   }
);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM