【发布时间】:2019-06-15 00:42:51
【问题描述】:
我目前正在编写一段代码,它只是将文件上传到 S3 存储桶。这是一个用 Typescript 编写的无服务器 NodeJS 项目。对于测试,我正在使用 Mocha、Chai,并尝试使用 SinonJS。
我有一个类,其方法可以将缓冲区作为文件上传到 S3:
import { S3 } from "aws-sdk"
import { S3UploadError } from "../errors/S3UploadError"
/**
* This class provides a means of interacting with S3
*
* @export
* @class AWSS3Manager
*/
export class AWSS3Manager {
/**
* Instance of S3
*
* @private
* @type {S3}
* @memberof AWSS3Manager
*/
private s3: S3
/**
* Creates an instance of AWSS3Manager.
*
* @memberof AWSS3Manager
*/
public constructor() {
this.s3 = new S3()
}
/**
* Upload a file to bucket on S3 by using a buffer
*
* @param {Buffer} body
* @param {string} bucketName
* @param {string} fileName
* @returns {Promise<PromiseResult<S3.PutObjectOutput, S3UploadError>>}
* @memberof AWSS3Manager
*/
public async upload(body: Buffer, bucketName: string, fileName: string) {
const params = {
Body: body,
Bucket: bucketName,
Key: fileName,
}
try {
return await this.s3.putObject(params).promise()
} catch (err) {
console.log(err)
throw new S3UploadError()
}
}
}
我什至不确定这是否是正确的做法,但我想测试上述类的upload 方法。在我看来,为此我需要模拟来自S3.putObject 的响应,以确保外部库不会造成干扰。但是,无论我尝试了什么,我都无法让它发挥作用。
我曾尝试对S3 put 对象方法进行存根,但无济于事:
chai.should()
const assert = chai.assert
const expect = chai.expect
const s3manager = new AWSS3Manager()
let sandbox: sinon.SinonSandbox
let spy
describe("AWSS3Manager behaves as expected", () => {
beforeEach(() => {
sandbox = sinon.createSandbox()
spy = sinon.spy()
})
afterEach(() => {
// Restore the default sandbox here
sandbox.restore()
})
it("Uploads a file correctly to S3", async () => {
const putObjectStub = sinon.stub(S3.prototype, "putObject")
putObjectStub.yields("ERROR", 'data')
//const uploadStub = sandbox.stub(s3manager, "upload").resolves("Yup")
//sandbox.stub(AWS, "S3").resolves('HEYY')
const test = await s3manager.upload(new Buffer("ddds"), "TestBucket", "Test")
assert(putObjectStub.called)
})
})
我已经尝试对 S3 方法进行存根,并且还对自身的上传方法进行存根,并查看对 putObject 的调用次数,但我无能为力。
谁能帮忙?
【问题讨论】:
-
s3 实例的构造函数注入不会使测试分配更容易吗?
标签: node.js typescript unit-testing aws-sdk sinon