Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Typescript 使用带有';aws sdk模拟&x27;_Typescript_Aws Sdk_Aws Sdk Mock - Fatal编程技术网

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);”一行,但这对我不起作用。也许它仍然有帮助,以下是我的解决方案: