首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用带有'aws-sdk-mock‘的TypeScript

使用带有'aws-sdk-mock‘的TypeScript
EN

Stack Overflow用户
提问于 2018-08-04 02:57:14
回答 2查看 3.8K关注 0票数 2

所以这个问题被问到了,这里有一个答案:Is it possible to use TypeScript with 'aws-sdk-mock'

我没有足够的名气来询问答案,所以我不得不创建另一个问题,因为我无法得到答案。

下面是我的全部测试代码:

代码语言:javascript
复制
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

有什么想法吗?谢谢!

EN

回答 2

Stack Overflow用户

发布于 2018-10-10 16:25:30

我在和你一样的代码中遇到了同样的问题。我解决了。首先,你是对的,你必须像看起来那样在typescript中设置SDKInstance。其次,模拟函数中的第一个参数必须是PutItemInput类型,不能为空。如果您正在模拟另一个函数,如GetItem,则第一个参数的类型必须为GetItemInput,依此类推。以下是我使用GetItem的工作解决方案:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-01-15 08:40:26

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

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

source.ts

代码语言:javascript
复制
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

代码语言:javascript
复制
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服务。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51678615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档