网站搜索

typescript - AWS S3 - 遇到错误 “Jest 检测到以下 1 个未关闭的句柄,可能导致 Jest 无法退出”


在我的一个函数中,我正在从 AWS S3 获取一个文件并在回调中处理它。

async readJSONData(fileKey: string, callback: (output: string, custom_params?: any) => any, custom_params?: any): Promise<string[]> {
        let params = {
            Bucket: this.bucketName,
            Key:  fileKey,
        };

        let output : string = await this.s3.getObject(params)
            .promise()
            .then((res : PromiseResult<GetObjectOutput, AWSError>) => {
                if (!this.isAWSError(res) || !res.Body)
                    throw Error
                else
                    return res.Body.toString()
            })


        return callback((output), custom_params)
    }

我的代码运行正常,直到我在使用此函数的类上运行 Jest 测试。测试大致如下所示:

import {MyClass} from "../ClassUsingAWSS3Fetch";

describe('aws_using_class_test', () => {
    test('test case', () => {
        MyClass.run(args)
            .then(res => {
                expect(res).toBe("expected behavior")
            })
    })
})

我明白

"ReferenceError: You are trying to `import` a file after the Jest environment has been torn down."

并且使用 --detectOpenHandles 我得到

Jest has detected the following 1 open handle potentially keeping Jest from exiting:

 ●  TCPWRAP

      25 |         };
      26 |         let output = await this.s3.getObject(params)
    > 27 |             .promise()
         |              ^
      28 |             .then((res) => {
      29 |             if (!this.isAWSError(res) || !res.Body)
      30 |                 throw Error;

      at features.constructor.handleRequest (node_modules/aws-sdk/lib/http/node.js:45:23)
      at executeSend (node_modules/aws-sdk/lib/event_listeners.js:371:29)
      at Request.SEND (node_modules/aws-sdk/lib/event_listeners.js:385:9)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at node_modules/aws-sdk/lib/event_listeners.js:270:9
      at finish (node_modules/aws-sdk/lib/config.js:386:7)
      at node_modules/aws-sdk/lib/config.js:404:9
      at Credentials.get (node_modules/aws-sdk/lib/credentials.js:127:7)
      at getAsyncCredentials (node_modules/aws-sdk/lib/config.js:398:24)
      at Config.getCredentials (node_modules/aws-sdk/lib/config.js:418:9)
      at Request.SIGN (node_modules/aws-sdk/lib/event_listeners.js:241:22)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at Request.discoverEndpoint (node_modules/aws-sdk/lib/discover_endpoint.js:365:7)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at node_modules/aws-sdk/lib/state_machine.js:27:10
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:38:9)
      at Request.<anonymous> (node_modules/aws-sdk/lib/request.js:690:12)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:116:18)
      at callNextListener (node_modules/aws-sdk/lib/sequential_executor.js:96:12)
      at node_modules/aws-sdk/lib/event_listeners.js:86:9
      at finish (node_modules/aws-sdk/lib/config.js:386:7)
      at node_modules/aws-sdk/lib/config.js:404:9
      at Credentials.get (node_modules/aws-sdk/lib/credentials.js:127:7)
      at getAsyncCredentials (node_modules/aws-sdk/lib/config.js:398:24)
      at Config.getCredentials (node_modules/aws-sdk/lib/config.js:418:9)
      at Request.VALIDATE_CREDENTIALS (node_modules/aws-sdk/lib/event_listeners.js:81:26)
      at Request.callListeners (node_modules/aws-sdk/lib/sequential_executor.js:102:18)
      at Request.emit (node_modules/aws-sdk/lib/sequential_executor.js:78:10)
      at Request.emit (node_modules/aws-sdk/lib/request.js:688:14)
      at Request.transition (node_modules/aws-sdk/lib/request.js:22:10)
      at AcceptorStateMachine.runTo (node_modules/aws-sdk/lib/state_machine.js:15:12)
      at Request.runTo (node_modules/aws-sdk/lib/request.js:408:15)
      at node_modules/aws-sdk/lib/request.js:797:12
      at Request.promise (node_modules/aws-sdk/lib/request.js:783:12)
      at S3Reader.readJSONData (build/helpers/s3-reader.js:27:14)
      at Function.classifyProduct (build/modules/scrape-deals/lib/classifier/classifierClass.js:48:19)
      at Function.classify (build/modules/scrape-deals/lib/classifier/classifierClass.js:36:66)
      at Object.<anonymous> (build/__tests__/classifier.js:6:43)

我理解正确吗,AWS S3 正在打开一个套接字并保持其活跃状态——而在执行测试时,Jest 不喜欢这样?