【问题标题】:Chai expect assertion to.have.string failure: UnhandledPromiseRejectionWarningChai 期望断言 to.have.string 失败:UnhandledPromiseRejectionWarning
【发布时间】:2017-03-04 05:50:23
【问题描述】:

我有一个带有 firebase-server 模块实例的测试套件,在测试套件和另一个单独的函数中都被调用。

这样我就可以在我的 firebase 实例中使用模拟值测试各种测试用例。

在我的测试套件中,我执行了各种测试,它们都按预期工作,直到我达到我正在测试 Firebase 承诺的程度:

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}`));

通过模拟数据库内容使我对 lambda 函数的调用失败:

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 );
});

现在,我知道 lambda 函数正在返回错误,但我不知道如何在测试端处理错误断言。当我试图期待一个特定的字符串时,它每次都通过测试,无论我期待什么字符串。如果我期望出现错误:

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

谁能指出我正确的方向?

【问题讨论】:

  • “在功能方面”?
  • 你说得对,我猜是含蓄的,我要修改措辞。

标签: node.js unit-testing firebase promise mocha.js


【解决方案1】:

您似乎成功地引发了所需的错误,但没有正确处理错误情况。

问题很可能源于对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 表达式。

【讨论】:

    【解决方案2】:

    这是 NodeJS 支持您并告诉您有一个您不知道的错误以及问题出在哪里。如果您使用 --trace-warnings 运行它,它还会向您显示它起源的确切行。

    Node 告诉您,您正在向数据库传递一个无效的语音应用程序名称。您应该解决该问题或在执行该操作的地方处理警告。

    同样,您可以使用--trace-warnings 找出它所在的行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2019-04-11
      • 1970-01-01
      • 2017-10-02
      相关资源
      最近更新 更多