【发布时间】:2019-04-29 03:33:28
【问题描述】:
我的问题如下:我想测试一种将大量数据上传到 AWS S3 存储桶的方法。问题是:我不想在每次测试时都上传数据,也不想关心环境中的凭据。所以我想设置 Sinon 的 fake-server 模块来模拟上传并返回与 S3 相同的结果。可悲的是,似乎很难找到使用 async/await 的代码的工作示例。
我的测试如下所示:
import {skip, test, suite} from "mocha-typescript";
import Chai from "chai";
import {S3Uploader} from "./s3-uploader.class";
import Sinon from "sinon";
@suite
class S3UploaderTest {
public server : Sinon.SinonFakeServer | undefined;
before() {
this.server = Sinon.fakeServer.create();
}
after() {
if (this.server != null) this.server.restore();
}
@test
async "should upload a file to s3 correctly"(){
let spy = Sinon.spy();
const uploader : S3Uploader = new S3Uploader();
const upload = await uploader.send("HalloWelt").toBucket("onetimeupload.test").toFolder("test/hw.txt").upload();
Chai.expect(upload).to.be.a("object");
}
}
在 uploader.upload() 方法中,我从回调中解决了一个承诺。那么如何模拟上传过程呢?
编辑:这里是 s3-uploader 的代码:
import AWS from "aws-sdk";
export class S3Uploader {
private s3 = new AWS.S3({ accessKeyId : process.env.ACCESS_KEY_ID, secretAccessKey : process.env.SECRET_ACCESS_KEY });
private params = {
Body: null || Object,
Bucket: "",
Key: ""
};
public send(stream : any) {
this.params.Body = stream;
return this;
}
public toBucket(bucket : string) {
this.params.Bucket = bucket;
return this;
}
public toFolder(path : string) {
this.params.Key = path;
return this;
}
public upload() {
return new Promise((resolve, reject) => {
if (process.env.ACCESS_KEY_ID == null || process.env.SECRET_ACCESS_KEY == null) {
return reject("ERR_NO_AWS_CREDENTIALS");
}
this.s3.upload(this.params, (error : any, data : any) => {
return error ? reject(error) : resolve(data);
});
});
}
}
【问题讨论】:
-
如果我们使用 Sinon 来存根上传器方法并返回所需的结果,你怎么看?
-
你能发布
s3-uploader代码吗?这将使我们能够给您一个具体的答案。 -
当然。这样做了。
标签: node.js typescript mocha.js sinon