#node.js #unit-testing #firebase #promise #mocha.js
#node.js #модульное тестирование #firebase #обещание #mocha.js
Вопрос:
У меня есть набор тестов с экземпляром firebase-серверный модуль, вызываемый как в наборе тестов, так и в другой отдельной функции.
Это позволяет мне тестировать различные тестовые примеры с фиктивными значениями внутри моего экземпляра firebase.
В моем наборе тестов я выполняю различные тесты, и все они работают по назначению, пока я не дойду до того момента, когда я тестирую Firebase promise:
Firebase.database().ref('userData').once('value').then((data) => {
// --- USER ID VALIDATION ---//
if (!userIds[USER_ID]) {
throw(`Invalid User ID: ${USER_ID}`);
}
updates[`${USER_ID}/sessions/${newSessionKey}`] = event.session;
// --- UPDATE DATABASE ---//
Firebase.database().ref().update(updates)
.then(() => context.succeed('Database Write Successful.'))
.catch(error => context.fail(`Database Write Error: ${error}`));
})
.catch(error => context.fail(`Database Access Error: ${error}`));
издеваясь над содержимым базы данных, чтобы вызвать сбой моей лямбда-функции:
it( 'should fail invocation with invalid user Id: ', function( done ) {
var context = {
succeed: function() {
done( new Error( 'never context.succeed' ) );
},
fail: function( errorMessage ) {
expect( errorMessage ).to.have.string("Invalid User ID");
done( );
}
}
dbReset();// resetting database state to valid format
Firebase.database().ref('userData').set({
"InvalidFakeUserID" : {
"apiHits" : 100
}
})
myLambda( event, context );
});
Теперь я понимаю, что лямбда-функция возвращает ошибку, но я не могу понять, как обработать утверждение об ошибке на тестовой стороне. Когда я пытаюсь ожидать определенную строку, она проходит тест каждый раз, независимо от того, какую строку я ожидаю. Если вместо этого я ожидаю ошибку:
fail: function( errorMessage ) {
expect( errorMessage ).be.an('error');
done( );
}
это также вызывает ошибку:
(node:12144) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): AssertionError: expected 'Opearlo Analytics --- Database Access Error: Error: Invalid Voice App Name: fakeNameNotPresentOnDB' to be an error
Кто-нибудь, кто может указать мне правильное направление?
Комментарии:
1. «на стороне функции»?
2. Вы правы, я предполагаю, что это неявно, я собираюсь изменить формулировку.
Ответ №1:
Это NodeJS прикрывает вашу спину и сообщает вам, что у вас ошибка, о которой вы не знаете, и в чем проблема. Если вы запустите его с --trace-warnings
, оно также покажет вам точную строку, в которой оно возникло.
Узел сообщает вам, что вы передаете неверное имя голосового приложения в базу данных. Вы должны исправить это или обработать предупреждение в том месте, где вы это делаете.
Опять же, вы можете узнать, в какой строке это происходит --trace-warnings
.
Ответ №2:
Кажется, вы успешно вызываете желаемую ошибку, но не обрабатываете условие ошибки должным образом.
Проблема вполне может возникнуть из-за ожидания того, что error
всегда является строкой, приводящей к неожиданным выбросам при обработке ошибок.
В то время как явный throw(`Invalid User ID: ${USER_ID}`)
выдает String
, другие ошибки будут (или, по крайней мере, должны) выдавать Error
.
В любом случае, это нуждается в исправлении таким образом, чтобы выдавались / ожидались только ошибки.
Попробуйте :
Firebase.database().ref('userData').once('value').then((data) => {
// --- USER ID VALIDATION ---//
if (!userIds[USER_ID]) {
throw new Error(`Invalid User ID: ${USER_ID}`);
}
updates[`${USER_ID}/sessions/${newSessionKey}`] = event.session;
// --- UPDATE DATABASE ---//
Firebase.database().ref().update(updates)
.then(() => context.succeed('Database Write Successful.'))
.catch(error => {
throw new Error(`Database Write Error: ${error.message}`);
});
}, error => {
throw new Error(`Database Access Error: ${error.message}`)
})
// catch whatever Error was thrown, explicitly or otherwise
.catch(error => context.fail(error.message)); // pass `error.message`, or ...
// .catch(error => context.fail(error)); // ... pass the entire error
И, на тестовой стороне, напишите свое expect
выражение соответствующим образом.