首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单曲中的Middy,类型记录和Jest

单曲中的Middy,类型记录和Jest
EN

Stack Overflow用户
提问于 2022-06-01 18:24:23
回答 1查看 405关注 0票数 0

我已经使用Lerna和yarn workspace建立了一个类型记录项目。这个项目包括一个API网关API,它由几个Lambda函数支持,这些函数将Middy用于CORS和处理超时。我更喜欢对我的代码进行单元测试,所以我使用Jest为这些Lambda函数编写了测试,并使用ts-jest运行它们。但是,当我为其中一个Lambdas运行单元测试(到目前为止我编写的唯一测试)时,我会看到下面的错误。

我尝试将"esmoduleInterop": true (如建议的这里)添加到包目录中的tsconfig.jsoncompilerOptions部分。我尝试将它添加到根tsconfig.json中。我为Jest尝试了一个定制的tsconfig.json,并在那里添加了它。没什么。我做错了什么?

错误:

代码语言:javascript
复制
 FAIL  packages/announcer/test/api/list-non-compliant-rules.test.ts
  ● Test suite failed to run

    TypeError: core_1.default is not a function

       97 | }
       98 |
    >  99 | export const handler = middy(main, {
          |                             ^
      100 |   timeoutEarlyInMillis: TIMEOUT,
      101 |   timeoutEarlyResponse: () => {
      102 |     Log.error(`Timeout of ${TIMEOUT}ms exceeded`)

      at Object.<anonymous> (lambda/api/list-non-compliant-rules.ts:99:29)
      at Object.<anonymous> (test/api/list-non-compliant-rules.test.ts:4:36)

我是这样进口米迪的:

代码语言:javascript
复制
import middy from "@middy/core"

我是这样用它的:

代码语言:javascript
复制
export const handler = middy(main, {
  timeoutEarlyInMillis: TIMEOUT,
  timeoutEarlyResponse: () => {
    Log.error(`Timeout of ${TIMEOUT}ms exceeded`)
    return internalServerError(new Error("Timeout"))
  },
})
  .use(cors())
  .use(httpErrorHandler())
  .use(
    httpContentNegotiation({
      availableLanguages: ["en-US"],
      availableMediaTypes: ["application/vnd.api+json"],
    })
  )

封装tsconfig.json

代码语言:javascript
复制
{
  "extends": "../../tsconfig.json",
  "compilerOptions": {
    "types": ["node", "jest"],
    "esModuleInterop": true,
  },
  "exclude": ["node_modules", "cdk.out"]
}

tsconfig.json

代码语言:javascript
复制
{
  "compilerOptions": {
    "target": "ES2018",
    "module": "commonjs",
    "lib": ["es2018"],
    "declaration": true,
    "strict": true,
    "noImplicitAny": true,
    "strictNullChecks": true,
    "noImplicitThis": true,
    "alwaysStrict": true,
    "noUnusedLocals": false,
    "noUnusedParameters": false,
    "noImplicitReturns": true,
    "noFallthroughCasesInSwitch": false,
    "inlineSourceMap": true,
    "inlineSources": true,
    "experimentalDecorators": true,
    "strictPropertyInitialization": false,
    "typeRoots": ["./node_modules/@types"],
    "esModuleInterop": true
  },
}
EN

回答 1

Stack Overflow用户

发布于 2022-09-23 03:19:10

这可能是由于API网关事件填充不够。

例如,只是指定

代码语言:javascript
复制
{
 "headers": {
 "Content-Type": "application/json"
 },
  "body": "{\"ResendEmail\":{\"winId\": \"jr-1234-1234-1234\", \"timestamp\": 1234, \"message\": \"A canned message\"}}"
}

是不够的。

指定整个事件

代码语言:javascript
复制
const defaultEvent: APIGatewayProxyEvent = {
  httpMethod: 'post',
  headers: {Authorization: "dummyToken"},
  body: "dummyBody",
  isBase64Encoded: false,
  path: '/change-expiry-elapsed-days',
  multiValueQueryStringParameters: null,
  multiValueHeaders: null,
  pathParameters: null,
  queryStringParameters: null,
  stageVariables: null,
  requestContext: null,
  resource: ''
}

const defaultEvent2: APIGatewayProxyEvent = {
 ...defaultEvent,
 ...mockCall,
};

然后打电话

代码语言:javascript
复制
describe('Resend email', function () {
  beforeEach(() => {
    ddbMock.reset()
    jest.restoreAllMocks();
  });

  test('verifies successful response', async () => {
   const result = await main(defaultEvent2, defaultContext) as 
   ResponseTest
   expect(result).toEqual({});
});

我使用的上下文也有

代码语言:javascript
复制
getRemainingTimeInMillis: () => 0,

代码语言:javascript
复制
const defaultContext: Context = {
  callbackWaitsForEmptyEventLoop: false,
  functionName: 'test',
  functionVersion: '1',
  invokedFunctionArn: 'arn',
  memoryLimitInMB: '1',
  awsRequestId: 'aws',
  logGroupName: 'log',
  logStreamName: 'stream',
  getRemainingTimeInMillis: () => 0,
  done: () => {
  },
    fail: () => {
  },
    succeed: () => {
  }
}

此外,调用确实对输入进行建模。如果输入是json编码的字符串,那么middy将解析“body”如果您应用

代码语言:javascript
复制
const defaultEvent: APIGatewayProxyEvent = {
httpMethod: 'post',
headers: {
    authorization: authorizationSample,
    "Content-Type": "application/json",
},
body: JSON.stringify({ApproveWinner: apiParamsBasic}),

如果省略“Content”,那么正文中的JSON将作为字符串传递给处理程序函数。对于Content,它将被解析为JSON。

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

https://stackoverflow.com/questions/72466484

复制
相关文章

相似问题

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