Как правильно пройти JSON Event в тесте Jest при локальном вызове AWS Lambda - PullRequest
1 голос
/ 22 апреля 2019

У меня есть лямбда (в node.js), которая работает в производстве:

'use strict';

const AWS = require('aws-sdk');
const Politician = require('../model/politician.js');

const dynamoDb = new AWS.DynamoDB.DocumentClient();

module.exports.put = async (event, context) => {

    const requestBody = new Politician(JSON.parse(event.body));

    return await submit(requestBody)
        .then(res => {
            return {
                statusCode: 200,
                body: JSON.stringify({
                    message: `Successfully submitted politician with name ${requestBody.name}`,
                    politicianId: res.id
                })
            }

        })
        .catch(err => {
            return {
                statusCode: 500,
                body: JSON.stringify({
                    message: `Error while submitting politician with name ${requestBody.name}`,
                })
            }
        });

};

const submit = politician => {

    return new Promise((resolve, reject) => {
        if (politician) {
            resolve(politician);
        } else {
            reject(new Error('it all went bad!'));
        }
    });
};

Проблема возникает при попытке установить локальный тест лямбды (я использую Безсерверный фреймворк ).Проблема в том, что я не могу передать какой-либо формат события, которое также не производит:

SyntaxError: Unexpected token u in JSON at position 0

      12 |     console.log(typeof event.body);
      13 | 
    > 14 |     const requestBody = new Politician(JSON.parse(event.body));
         |                                             ^
      15 | 
      16 | 
      17 |     return await submit(requestBody)

          at JSON.parse (<anonymous>)
      at Object.parse [as put] (functions/coxon-put-politician.js:14:45)
      at Object.put (functions-test/coxon-put-politician.test.js:37:37)

, поэтому его значение не определено, когда я делаю это:

'use strict';
const AWS = require('aws-sdk');
const options = {
    region: 'localhost',
    endpoint: 'http://localhost:8000'
};
AWS.config.update(options);

const eventStub = require('../events/graham.richardson.json');
const lambda = require('../functions/coxon-put-politician');

describe('Service politicians: mock for successful operations', () => {

    test('Replies back with a JSON response', async () => {
        const event = '{"body":' + JSON.stringify(eventStub) + '}';
        const context = {};

        const result = await lambda.put(event, context);

        console.log(data);
        expect(result).toBeTruthy();
        expect(result.statusCode).toBe(200);
        expect(result.body).toBe(`{"result":"${result}"}`);
        expect(result.body.message.toContain('Successfully submitted politician'))

    });
});

или выдает:

SyntaxError: Unexpected token o in JSON at position 1

      12 |     console.log(typeof event.body);
      13 | 
    > 14 |     const requestBody = new Politician(JSON.parse(event.body));
         |                                             ^
      15 | 
      16 | 
      17 |     return await submit(requestBody)

          at JSON.parse (<anonymous>)
      at Object.parse [as put] (functions/coxon-put-politician.js:14:45)
      at Object.put (functions-test/coxon-put-politician.test.js:38:37)

, когда я пытаюсь это сделать:

'use strict';
const AWS = require('aws-sdk');
const options = {
    region: 'localhost',
    endpoint: 'http://localhost:8000'
};
AWS.config.update(options);

const eventStub = require('../events/graham.richardson.json');
const lambda = require('../functions/coxon-put-politician');

describe('Service politicians: mock for successful operations', () => {

    test('Replies back with a JSON response', async () => {
        const event = { body: eventStub };
        const context = {};

        const result = await lambda.put(event, context);

        expect(result).toBeTruthy();
        expect(result.statusCode).toBe(200);
        expect(result.body).toBe(`{"result":"${result}"}`);
        expect(result.body.message.toContain('Successfully submitted politician'))

    });
});

Так что, похоже, что в любом случае я получаю ошибку.Итак, что мне передать в тест как событие, чтобы JSON.parse(event) работал?

1 Ответ

2 голосов
/ 22 апреля 2019

TL; DR: const event = { body: JSON.stringify(eventStub) }

Ваш производственный код работает, потому что код написан правильно для ожидаемой структуры полезной нагрузки, где event - это объект, а event.body - это JSON-разборная строка.

В вашем первом тесте вы передаете event не как объект, а как строку, разбираемую JSON. event.body не определено, поскольку event в виде строки не имеет body в качестве параметра.

Ваш тест должен быть const event = { body: JSON.stringify(eventStub) }, обратите внимание, что это объект с атрибутом body, который является строкой.

Во второй попытке вы передаете объект, а затем при попытке JSON.parse() объект выдает ошибку.

Обратите внимание на ошибку:

Неожиданный токен o в JSON в позиции 1

o - это позиция 1 в object..., например, u - это позиция 1 для undefined.

...