2

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

有什么想法吗?谢谢!

4

2 回答 2

1

我遇到了同样的问题,最终解决方案很简单:我使用了错误的AWS实例。

在我看到的示例中,它们都AWS在测试文件中创建了一个新实例,但对我有用的是使用AWS我想要测试的源代码中的相同实例。

来源.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) => {
        // ...
    })
}

源.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

于 2020-01-15T00:40:25.723 回答
1

我遇到了和你一样的代码同样的问题。我解决了。首先,你是对的,你必须在 typescript 中设置 SDKInstance,就像它看起来一样。其次,mocked函数中的第一个参数必须是PutItemInput类型,不能为null。如果您要模拟 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。

于 2018-10-10T08:25:29.597 回答