2016-10-21 3 views
0

Ich habe eine Testsuite mit einer Instanz von Firebase-Server-Modul, aufgerufen sowohl in der Testsuite als auch eine andere separate Funktion.Chai erwarte assertion to.have.string failure: UnhandledPromiseRejectionWarning

Das ist so, dass ich verschiedene Testfälle mit Scheinwerten innerhalb meiner Firebase-Instanz testen kann.

In meinem Test-Suite durchführen ich verschiedene Tests, und sie alle arbeiten, wie beabsichtigt, bis ich zu dem Punkt, wo ich Firebase Versprechen mich entschieden:

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

durch den Datenbankinhalt spöttisch meinem Ruf zu meinen machen Lambda-Funktion fehlschlagen:

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

Jetzt verstehe ich, dass die Lambda-Funktion einen Fehler zurückgibt, aber ich kann nicht verstehen, wie der Fehler Behauptung auf der Testseite zu behandeln. Wenn ich versuche, eine bestimmte Zeichenfolge zu erwarten, besteht sie jedes Mal den Test, unabhängig davon, welche Zeichenfolge ich erwarte. Wenn ich erwarte einen Fehler statt:

fail: function(errorMessage) { 
     expect(errorMessage).be.an('error'); 
     done(); 
} 

es auch einen Fehler auslöst:

(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

Jeder, der mich in die richtige Richtung zeigen kann?

+0

"auf der Funktionsseite"? –

+0

Sie haben Recht, ich denke, es ist implizit, ich werde den Wortlaut ändern. – iomv

Antwort

0

Es scheint, dass Sie den gewünschten Fehler erfolgreich provozieren, aber die Fehlerbedingung nicht richtig behandeln.

Problem kann durchaus aus der Erwartung entstehen, dass error immer String ist, der zu unerwarteten Würfen von Ihrer Fehlerbehandlung führt.

Während die explizite throw(`Invalid User ID: ${USER_ID}`) wirft String, werden andere Fehler (oder zumindest sollte) Error werfen.

In jedem Fall muss es behoben werden, so dass nur Fehler geworfen/erwartet werden.

Versuchen:

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 

Und auf der Testseite, schreiben Sie Ihre expect entsprechend Ausdruck.

1

Dies ist NodeJS mit Ihrem Rücken und Ihnen sagen, Sie haben einen Fehler, den Sie nicht wissen und wo das Problem ist. Wenn Sie es mit --trace-warnings ausführen, zeigt es Ihnen auch die genaue Zeile, in der es entstanden ist.

Node teilt Ihnen mit, dass Sie einen ungültigen Voice-App-Namen an die Datenbank übergeben. Sie sollten das beheben oder die Warnung an der Stelle behandeln, an der Sie das tun.

Wieder können Sie herausfinden, in welcher Zeile es passiert mit --trace-warnings.

Verwandte Themen