Chai期望断言to.have.string失败:UnhandledPromiseRejectionWarning

时间:2016-10-21 20:12:07

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

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

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

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

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

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

(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

它也会触发错误:

File.new

任何可以指出我正确方向的人?

2 个答案:

答案 0 :(得分:1)

这是NodeJS背对着你并且告诉你你有一个你不知道的错误以及问题出在哪里。如果您使用--trace-warnings运行它,它还会显示它产生的确切行。

Node告诉您,您正在将无效的语音应用名称传递给数据库。您应该修复它或在您执行此操作的位置处理警告。

同样,您可以找到--trace-warnings中出现的行。

答案 1 :(得分:0)

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

问题很可能源于error始终是String导致错误处理意外抛出的期望。

明确的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表达式。