aws sdk - Bruke TypeScript med 'aws-sdk-mock'
Så dette spørsmålet ble stilt og det var et svar her: Er det mulig å bruke TypeScript med 'aws-sdk-mock'
Jeg har ikke nok omdømme til å spørre om svaret, så jeg måtte lage et annet spørsmål fordi jeg ikke fikk svaret til å fungere.
Her er hele testkoden min:
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();
Versjoner :
aws-sdk: 2.286.2
aws-sdk-mock: 4.0.0
Test rammeverk: mocha 3.4.2
Noen tanker? Takk!
Svar #1
Jeg hadde dette samme problemet, og løsningen viste seg å være enkel: Jeg brukte feil AWS-instans.
I eksemplene jeg så, opprettet de alle en ny AWS-instans i testfilen, men det som fungerte for meg var å bruke den samme AWS-instansen fra kildekoden min som jeg ønsket å teste.
kilde.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()
})
})
Merk at typen til params ikke trenger å være den faktiske typen fra aws-sdk-typedefinisjonene. any fungerte for meg.
Også, som de andre svarene har sagt, må du initialisere AWS-tjenesten inne i funksjonen du tester (kilde)
Svar #2
Jeg støtte på det samme problemet med den samme koden som deg. Jeg løste det. Først, du har rett, du må sette SDKInstance i typescript som det ser ut til. For det andre, den første parameteren i den mockede funksjonen må være av typen PutItemInput, som ikke kan være null. Hvis du mocker en annen funksjon som GetItem, må den første parameteren være av typen GetItemInput, og så videre. Her er min fungerende løsning med 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');
});
Hvis jeg utelater parameterne i getItem-kallet, fungerer det heller ikke.
Det du må gjøre for å få dette til å fungere med PutItem-metoden er å erstatte GetItemInput med PutItemInput.
