将TypeScript与'aws-sdk-mock'结合使用

时间:2018-08-03 18:57:14

标签: typescript aws-sdk aws-sdk-mock

所以问了这个问题,这里有一个答案: 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

有什么想法吗?谢谢!

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