#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 ? или не испускание события приведет к передаче функции ?