Typescript 使用带有';aws sdk模拟&x27;
所以有人问了这个问题,这里有一个答案: 我没有足够的声誉去问这个问题的答案,所以我不得不提出另一个问题,因为我无法得到有效的答案 以下是我的全部测试代码:Typescript 使用带有';aws sdk模拟&x27;,typescript,aws-sdk,aws-sdk-mock,Typescript,Aws Sdk,Aws Sdk Mock,所以有人问了这个问题,这里有一个答案: 我没有足够的声誉去问这个问题的答案,所以我不得不提出另一个问题,因为我无法得到有效的答案 以下是我的全部测试代码: const AWSMock = require('aws-sdk-mock'); const AWS = require('aws-sdk'); AWSMock.setSDKInstance(AWS); AWSMock.mock('DynamoDB', 'putItem', function (params, callback) { c
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模拟版:4.0.0
测试框架:摩卡3.4.2
有什么想法吗?谢谢 我和你一样用同一段代码遇到了同样的问题。 我解决了。首先,您是对的,您必须在typescript中设置SDKInstance。其次,模拟函数中的第一个参数必须是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方法起作用,您必须做的是用PutItemInput替换GetItemInput。我遇到了同样的问题,解决方案很简单:我使用了错误的
AWS
实例
在我看到的示例中,他们都在测试文件中创建了一个新的AWS
实例,但对我有效的是使用了我想要测试的源代码中的同一个AWS
实例
source.ts
export const aws=require('aws-sdk'))
导出异步函数myFunction(bucket:string):Promise{
常量参数:any={Bucket:Bucket}
const s3=新的aws.s3()
s3.listObjects(参数,(错误:任意,数据:任意)=>{
// ...
})
}
source.test.ts
import*作为AWSMock从“aws sdk模拟”导入
从“source.ts”导入{aws,myFunction}
描述(“myFunction”,()=>{
它(“应该被模拟”,异步()=>{
AWSMock.setSDKInstance(aws)
mock('S3','listObjects',(参数:any,回调:Function)=>{
回调(null,{Contents:[{Key:'file1.csv'}]})
})
// ...
AWSMock.restore()
})
})
请注意,params
的类型不必是aws sdk
类型定义中的实际类型<代码>任何对我有用
此外,正如其他答案所说,您需要在您正在测试的函数中初始化AWS服务()什么不适用于您的代码?它说“不模拟!”而不是“模仿作品!”似乎与typescript没有太大关系。其他人也很难让aws sdk mock使用typescript:因此有人建议使用“AWSMock.setSDKInstance(aws);”一行,但这对我不起作用。也许它仍然有帮助,以下是我的解决方案: