Сделайте тест с Jest на моем сервере без приложения - PullRequest
0 голосов
/ 06 ноября 2019

У меня есть серверное приложение, и я хочу провести на нем модульное тестирование

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

У меня есть функциякак это в tools.js файле

const ddb = require('./ddb');
const table = process.env.USER_TABLE;

...

module.exports.mailExist = async email => {
  if (!email) {
    throw new Error('Missing parameters');
  }
  return await ddb.scan({
    TableName: table,
    FilterExpression: 'email = :email',
    ExpressionAttributeValues: {
      ':email': email
    },
    ProjectionExpression: ['uid']
  });
};

И я хотел бы проверить это в __ test __ / tools.test.js file

describe('mailExist', async () => {
    const email = 'example@example.com';
    const mailExist = await tools.mailExist(email)
    it('should not exist', () => {
        expect(mailExist).toBe({})
    })
});

Проблема в том, что когда я запускаю свой тест, он возвращает

Отсутствует обязательный ключ TableName в параметрах

, поскольку моя переменная tableпеременная окружения

И если я напишу имя таблицы после переменной окружения, она вернет

Отсутствует область в конфигурации

Так что мой вопрос, Я хотел бы знать, как я могу проверить свою функцию моего серверного приложения в определенном файле и как я могу передать свою конфигурацию AWS своей функции?

Если у вас есть вопросы, скажите мне

Спасибо

PS: моя функция сканирования в файле ddb выглядит следующим образом

//ddb.js

module.exports.scan = async params => {
    const result = await DynamoDB.scan(params).promise();
    return result.Items;
};

1 Ответ

0 голосов
/ 07 ноября 2019

Вот решение для модульного тестирования:

tools.js:

const ddb = require('./ddb');

const table = process.env.TableName;

module.exports.mailExist = async email => {
  if (!email) {
    throw new Error('Missing parameters');
  }
  return await ddb.scan({
    TableName: table,
    FilterExpression: 'email = :email',
    ExpressionAttributeValues: {
      ':email': email
    },
    ProjectionExpression: ['uid']
  });
};

tools.spec.js, перед установкой tools.js необходимо сначала установить переменную среды. Мы сохраняем исходную переменную среды TableName в переменной и восстанавливаем переменные среды после завершения всех модульных тестов.

const ddb = require('./ddb');

describe('mailExist', () => {
  const TableName = process.env.TableName;
  const fakeTableName = 'fake table name';
  beforeAll(() => {
    process.env.TableName = fakeTableName;
  });
  afterAll(() => {
    process.env.TableName = TableName;
  });

  test('should not exist', async () => {
    const tools = require('./tools');
    const email = 'example@example.com';
    const scanSpy = jest.spyOn(ddb, 'scan').mockResolvedValueOnce({});
    const actualValue = await tools.mailExist(email);
    expect(actualValue).toEqual({});
    expect(scanSpy).toBeCalledWith({
      TableName: fakeTableName,
      FilterExpression: 'email = :email',
      ExpressionAttributeValues: {
        ':email': email
      },
      ProjectionExpression: ['uid']
    });
  });
});

Результат модульного теста:

PASS  src/stackoverflow/58727351/tools.spec.js
  mailExist
    ✓ should not exist (112ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |       80 |    66.67 |    66.67 |       75 |                   |
 ddb.js   |       50 |      100 |        0 |       50 |                 3 |
 tools.js |     87.5 |    66.67 |      100 |    83.33 |                 7 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.095s, estimated 8s
...