我已经使用Lerna和yarn workspace建立了一个类型记录项目。这个项目包括一个API网关API,它由几个Lambda函数支持,这些函数将Middy用于CORS和处理超时。我更喜欢对我的代码进行单元测试,所以我使用Jest为这些Lambda函数编写了测试,并使用ts-jest运行它们。但是,当我为其中一个Lambdas运行单元测试(到目前为止我编写的唯一测试)时,我会看到下面的错误。
我尝试将"esmoduleInterop": true (如建议的这里)添加到包目录中的tsconfig.json的compilerOptions部分。我尝试将它添加到根tsconfig.json中。我为Jest尝试了一个定制的tsconfig.json,并在那里添加了它。没什么。我做错了什么?
错误:
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)我是这样进口米迪的:
import middy from "@middy/core"我是这样用它的:
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
{
"extends": "../../tsconfig.json",
"compilerOptions": {
"types": ["node", "jest"],
"esModuleInterop": true,
},
"exclude": ["node_modules", "cdk.out"]
}根tsconfig.json
{
"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
},
}发布于 2022-09-23 03:19:10
这可能是由于API网关事件填充不够。
例如,只是指定
{
"headers": {
"Content-Type": "application/json"
},
"body": "{\"ResendEmail\":{\"winId\": \"jr-1234-1234-1234\", \"timestamp\": 1234, \"message\": \"A canned message\"}}"
}是不够的。
指定整个事件
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,
};然后打电话
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({});
});我使用的上下文也有
getRemainingTimeInMillis: () => 0,按
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”如果您应用
const defaultEvent: APIGatewayProxyEvent = {
httpMethod: 'post',
headers: {
authorization: authorizationSample,
"Content-Type": "application/json",
},
body: JSON.stringify({ApproveWinner: apiParamsBasic}),如果省略“Content”,那么正文中的JSON将作为字符串传递给处理程序函数。对于Content,它将被解析为JSON。
https://stackoverflow.com/questions/72466484
复制相似问题