Использование serverless-mocha-plugin для тестирования динамической конечной точки

Я создаю приложение API на NodeJS, используя бессерверную структуру. Я установил serverless-mocha-plugin и пытаюсь создать несколько модульных тестов для своих функций.

В моем serverless.yml файле у меня есть следующие конечные точки:

...
equipmentGetAll:
  handler: ./api/equipment/equipment.getAll
  events:
   - http:
     path: equipment
     method: get
     cors: true
equipmentGetOne:
  handler: ./api/equipment/equipment.getOne
  events:
    - http:
      path: equipment/{po_number}
      method: get
      cors: true
...

При тестировании конечной точки getAll я использую следующий тест, который прошел успешно. Я убедился, что он работает, записав ответ на консоль.

'use strict';

// tests for equipmentGetAll
// Generated by serverless-mocha-plugin

const mochaPlugin = require('serverless-mocha-plugin');
const expect = mochaPlugin.chai.expect;
let wrapped = mochaPlugin.getWrapper('equipmentGetAll', '/api/equipment/equipment.js', 'getAll');

describe('equipmentGetAll', () => {
  before((done) => {
    done();
  });

  it('should get all Equipment', () => {
    return wrapped.run({po_number:117}).then((response) => {
      expect(response.statusCode).to.be.equal(200);
      expect(response.body.length).to.be.greaterThan(0);
    });
  });
});

Точно так же для getOneendpoint я (пока) провожу очень похожий тест:

'use strict';

// tests for equipmentGetOne
// Generated by serverless-mocha-plugin

const mochaPlugin = require('serverless-mocha-plugin');
const expect = mochaPlugin.chai.expect;
let wrapped = mochaPlugin.getWrapper('equipmentGetOne', '/api/equipment/equipment.js', 'getOne');

describe('equipmentGetOne', () => {
  before((done) => {
    done();
  });

  it('should get one single Equipment', () => {
    return wrapped.run({}).then((response) => {
      expect(response.statusCode).to.be.equal(200);
      expect(response.body.length).to.be.equal(1);
    });
  });
});

Проблема

Текущий ответ, который я получаю для getOne:

{ 
  statusCode: 500,
  headers: { 'Content-Type': 'text/plain' },
  body: 'Cannot read property \'po_number\' of undefined' 
}

Поскольку путь для getOne из serverless.yml равен equipment/{po_number}, а не просто equipment/.

Как правильно передать значение пути для теста?

Образец вызова попадет в конечную точку my-api-endpoint.com/equipment/117 и вернет Оборудование с po_number 117. Это работает правильно при тестировании с помощью POSTMan, но как я могу заставить его работать с mocha-serverless-plugin?


person M.S.    schedule 21.02.2019    source источник
comment
Любые обновления? Получил ту же проблему   -  person Itay Katz    schedule 03.07.2019


Ответы (2)


Чтобы передать данные в лямбда, вы должны использовать
wrappedLambda.run({body: "String, not Object"})

Чтобы передать queryStringParametr в лямбда, вы должны использовать wrappedLambda.run({queryStringParameters: {a: "first",b:"second"}})

Чтобы передать параметры пути в лямбда, вы должны использовать wrappedLambda.run({pathParameters: {a: "first", b:"second"})

Простой пример для тестирования метода публикации

 context('save flashcard', () => {
        before((done) => {
            done();
        });
        it('save flashcard successfully', () => {
            return saveFlashcard.run({body: correctInput})
                .then((response) => {
                    const body = JSON.parse(response.body);
                    expect(body).to.have.property('_id')
                })
        });
});

это тело будет находиться внутри объекта события.

person Bartosz Gołębiowski    schedule 04.09.2019

Чтобы передать тело, вам нужно сделать что-то вроде этого

{
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    releaseDate: 2231213213,
    title: 'sfsdf',
    authorName: 'L'
  })
}
person Skoropad    schedule 14.06.2020