如何在玩笑中测试一个函数?

时间:2021-05-30 11:43:13

标签: 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 是一个 EventEmitter

dbModel 是一个与数据库交互的模块

center_id 是一个数字

session_id 是一个字符串

以上在所有情况下都是相同的

我需要在 3 种不同的情况下开玩笑地测试这个功能

<块引用>

情况 1:data = {available_capacity1: 4, available_capacity2: 6}

情况 2:data = {available_capacity1: 4}

情况 3:data = {available_capacity2: 6}

条件:

<块引用>

在 case 1 中,如果 data 传递给事件回调,则测试应该通过 侦听器,即:emitter.on('updateSession', callback),同时具有 available_capacity1available_capacity2 属性在 data.result 对象

在第 2 种情况下,如果 data 传递给事件回调,则测试应该通过 侦听器在 available_capacity1 对象中只有 data.result 属性

在第 3 种情况下,如果 data 传递给事件回调,则测试应该通过 侦听器在 available_capacity2 对象中只有 data.result 属性

我想知道如何在jest中为上述案例编写测试

非常感谢任何帮助,提前致谢。

1 个答案:

答案 0 :(得分:2)

要在玩笑中测试回调函数,您应该使用其测试函数的替代形式,在这种形式中,您使用确定测试结束时调用的回调参数。更多信息请访问: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);
});