2016-10-21 10 views
0

私は、テストスイートと別の別の機能の両方で呼び出されるfirebase-serverモジュールのインスタンスを持つテストスイートを持っています。アサーションto.have.stringの失敗が予想されます:UnhandledPromiseRejectionWarning

これは、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}`)); 

をラムダ関数は失敗:

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

誰ですか?

+0

「機能面で」? –

+0

あなたは正しいです、私はそれが暗黙のものだと思います、私は文言を修正するつもりです。 – iomv

答えて

0

あなたは正常に目的のエラーを引き起こしているが、エラー状態を適切に処理していないようです。

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式を書きます。

1

これはあなたの背中を持ち、あなたが気づいていないバグと問題がどこにあるかを伝えるNodeJSです。 --trace-warningsで実行すると、元の行も正確に表示されます。

無効な音声アプリケーション名をデータベースに渡していることをノードから伝えられています。あなたはそれを修正しなければなりません。

この場合も、--trace-warningsという行が表示されます。

関連する問題