我有一个带有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
任何可以指出我正确方向的人?
答案 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
表达式。