所以这个问题被问到了,这里有一个答案:Is it possible to use TypeScript with 'aws-sdk-mock'
我没有足够的名气来询问答案,所以我不得不创建另一个问题,因为我无法得到答案。
下面是我的全部测试代码:
const AWSMock = require('aws-sdk-mock');
const AWS = require('aws-sdk');
AWSMock.setSDKInstance(AWS);
AWSMock.mock('DynamoDB', 'putItem', function (params, callback) {
console.log('MOCK WORKS!')
});
const ddb = new AWS.DynamoDB();
ddb.putItem(null, function(err, data) {
console.log('NOT MOCKED!')
});
AWSMock.restore();版本:
aws-sdk: 2.286.2
aws-sdk-mock: 4.0.0
测试框架: mocha 3.4.2
有什么想法吗?谢谢!
发布于 2018-10-10 16:25:30
我在和你一样的代码中遇到了同样的问题。我解决了。首先,你是对的,你必须像看起来那样在typescript中设置SDKInstance。其次,模拟函数中的第一个参数必须是PutItemInput类型,不能为空。如果您正在模拟另一个函数,如GetItem,则第一个参数的类型必须为GetItemInput,依此类推。以下是我使用GetItem的工作解决方案:
mock('DynamoDB', 'getItem', function(params: GetItemInput, callback: Function) {
console.log('mock called');
callback();
}
let input: GetItemInput = { TableName: '', Key: {} };
const dynamodb = new DynamoDB({apiVersion: '2012-08-10'});
dynamodb.getItem(input, () => {
console.log('cb called');
});如果我在getItem调用中省略了参数,它也不能工作。
要使用PutItem-Method实现这一点,你需要做的就是用PutItemInput替换GetItemInput。
发布于 2020-01-15 08:40:26
我也遇到了同样的问题,最终解决方案很简单:我使用了错误的AWS实例。
在我看到的示例中,它们都在测试文件中创建了一个新的AWS实例,但对我有效的是使用我想要测试的源代码中的同一个AWS实例。
source.ts
export const aws = require('aws-sdk')
export async function myFunction(bucket: string): Promise<string> {
const params: any = { Bucket: bucket }
const s3 = new aws.S3()
s3.listObjects(params, (err: any, data: any) => {
// ...
})
}source.test.ts
import * as AWSMock from "aws-sdk-mock"
import {aws, myFunction} from "source.ts"
describe("myFunction", () => {
it("should be mocked", async () => {
AWSMock.setSDKInstance(aws)
AWSMock.mock('S3', 'listObjects', (params: any, callback: Function) => {
callback(null, {Contents: [{Key: 'file1.csv'}]})
})
// ...
AWSMock.restore()
})
})请注意,params的类型不必是aws-sdk类型定义中的实际类型。any为我工作。
此外,就像其他答案所说的那样,您需要在正在测试的函数(source)中初始化AWS服务。
https://stackoverflow.com/questions/51678615
复制相似问题