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

时间:2020-06-12 13:09:58

标签: amazon-web-services aws-lambda jestjs sinon

我正在尝试执行以下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的人都可能指出我的问题?

1 个答案:

答案 0 :(得分:0)

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

第二个想法

这是一个有关如何使用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