Чай ожидает, что утверждение будет.иметь.сбой строки: предупреждение о необработанном отказе

#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 выражение соответствующим образом.