使用Jest和Sinon测试AWS Lambda导致超时错误

问题描述 投票:0回答:1

我正在尝试执行以下Jest测试以在本地测试AWS Lambda:

const sinon = require('sinon');
const AWS = require('aws-sdk');

const { handler } = require('../queue_manager.js');

let result = {
    // some result
};

let sinonSandbox;

beforeEach((done) => {
    sinonSandbox = sinon.createSandbox();
    done();
})

afterEach((done) => {
    sinonSandbox.restore()
    done();
})

it('queue-manager', async () => {
    sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'get').returns({
        promise: function () {
            return Promise.resolve(result);
        }
    });

    const lambdaResponse = { code: 200, data: 'some mocked data' };

    var callback = function() { };
    var context = {}

    const event = {
        somedata: "data"
    };

    const actualValue = await handler(event, context, callback);

    expect(actualValue).toEqual(result);
});

我尝试在DynamoDB调用之后测试处理,但是测试失败,并显示以下错误:超时-在jest.setTimeout.Timeout指定的5000ms超时内未调用异步回调

我尝试给它更多的时间,但结果相同,因此并不是不是它不能在5秒钟内成功返回,而是没有全部返回。

熟悉Sinon的人可能会指出我的问题?

amazon-web-services aws-lambda jestjs sinon
1个回答
0
投票

帖子的编辑,第一版推到答案的底部a

第二个想法

这里是有关如何使用Jest测试异步功能的示例

test('the data is peanut butter', done => {
  function callback(data) {
    try {
      expect(data).toBe('peanut butter');
      done();
    } catch (error) {
      done(error);
    }
  }

  fetchData(callback);
});

然后,我认为代码中缺少的部分是单元测试函数的done回调。你可以试试这个吗:

it('queue-manager', async (done) => {
    sinonSandbox.stub(AWS.DynamoDB.DocumentClient.prototype, 'get').returns({
        promise: function () {
            return Promise.resolve(result);
        }
    });

    const lambdaResponse = { code: 200, data: 'some mocked data' };

    var callback = function() { };
    var context = {}

    const event = {
        somedata: "data"
    };

    const actualValue = await handler(event, context, callback);

    expect(actualValue).toEqual(result);
    done();
});

另一个选择可能是指定断言的数量(而不是回调done):

// before the await handler(...)
expect.assertions(1);

希望获得帮助。

第一个线索是dynamo db资源挂起:

lambda通常不返回结果,然后运行超时,因为lambda函数正在等待资源,例如:dynamoDB连接。

您可以通过将context.callbackWaitsForEmptyEventLoop设置为false来配置运行时以立即发送响应。

处理程序的第一行必须是:

context.callbackWaitsForEmptyEventLoop = false
© www.soinside.com 2019 - 2024. All rights reserved.