所以问了这个问题,这里有一个答案: 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
测试框架:摩卡咖啡3.4.2
有什么想法吗?谢谢!
答案 0 :(得分:1)
我遇到了和您一样的相同代码段的相同问题。 我解决了首先,很正确,必须像看起来那样在打字稿中设置SDKInstance。其次,模拟函数中的第一个参数必须为PutItemInput类型,不能为null。如果要模拟另一个函数,如GetItem,则第一个Parameter必须为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。
答案 1 :(得分:1)
我遇到了同样的问题,解决方案最终变得很简单:我使用了错误的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
为我工作。
也要像其他答案所说的那样,您需要在要测试的函数中初始化AWS服务(source)