Как протестировать функцию в шутку?

#javascript #unit-testing #jestjs

Вопрос:

 const updateSession = async (emitter, dbModel, center_id, session_id, data) => {

    if (await dbModel.update('session', {center_id, session_id, data})) {
        const result = {
            center_id: `k${center_id}`,
            session_id: session_id,
            ...data
        } ;
        emitter.emit('updateSession', {
            operationType: 'update',
            operationOn: 'session',
            data: result
        }) ;
    } else throw new Error('500 Internal Server Error') ;
}
 

emitter является инициатором событий

dbModel представляет собой модуль для взаимодействия с базой данных

center_id это число

session_id это строка

Все вышеперечисленное одинаково во всех случаях

Мне нужно проверить эту хуйню в шутку с 3 различными случаями, когда

случай 1 : data = {available_capacity1: 4, available_capacity2: 6}

случай 2 : data = {available_capacity1: 4}

случай 3 : data = {available_capacity2: 6}

Условия :

В случае 1 тест должен пройти, если data передан обратному вызову прослушивателя событий, то есть: emitter.on('updateSession', callback) , имеет оба available_capacity1 available_capacity2 свойства и в data.result объекте

В случае 2 тест должен пройти, если data переданный для обратного вызова прослушивателя событий имеет только available_capacity1 свойство в data.result объекте

В случае 3 тест должен пройти, если data переданный для обратного вызова прослушивателя событий имеет только available_capacity2 свойство в data.result объекте

Я хотел бы знать, как я могу написать тест для вышеупомянутых случаев в шутку

любая помощь будет очень признательна, заранее спасибо.

Комментарии:

1. То, что вы хотите сделать, не является модульным тестированием, и поэтому не рекомендуется. Вы хотите проверить обратный вызов, переданный emitter.on() , но вы делаете это в другом файле.

2. не обратный вызов, данные передаются в обратный вызов. что является результатом функции

Ответ №1:

Чтобы протестировать функцию обратного вызова в шутку, вам следует использовать альтернативную форму ее тестовой функции, в которой вы используете аргумент обратного вызова, который вы вызываете, когда определяете, что тест завершен. Более подробная информация здесь: https://jestjs.io/docs/asynchronous#callbacks

Вот пример того, как реализовать ваши конкретные тестовые примеры, они, конечно, не идеальны, но должны дать вам представление о том, как их выполнить самостоятельно.

 test('callback data has available_capacity1 and available_capacity2', done => {
  const data = { available_capacity1: 4, available_capacity2: 6 };
  const emitter = new EventEmitter();
  emitter.once('updateSession', arg => {
    try {
      expect(arg.data).toHaveProperty('available_capacity1');
      expect(arg.data).toHaveProperty('available_capacity2');
      done();
    } catch (error) {
      done(error);
    }
  });
  updateSession(emitter, dbModel, center_id, session_id, data);
});

test('callback data has only available_capacity1', done => {
  const data = { available_capacity1: 4 };
  const emitter = new EventEmitter();
  emitter.once('updateSession', arg => {
    try {
      expect(Object.keys(arg.data).length).toBe(1);
      expect(arg.data).toHaveProperty('available_capacity1');
      done();
    } catch (error) {
      done(error);
    }
  });
  updateSession(emitter, dbModel, center_id, session_id, data);
});

test('callback data has only available_capacity2', done => {
  const data = { available_capacity2: 6 };
  const emitter = new EventEmitter();
  emitter.once('updateSession', arg => {
    try {
      expect(Object.keys(arg.data).length).toBe(1);
      expect(arg.data).toHaveProperty('available_capacity2');
      done();
    } catch (error) {
      done(error);
    }
  });
  updateSession(emitter, dbModel, center_id, session_id, data);
});
 

Комментарии:

1. Я должен использовать утверждение, чтобы увидеть, есть ли минимум одно ожидаемое утверждение ryt ? или не испускание события приведет к передаче функции ?