2017-11-16 5 views
0

Bearbeiten: Dies ist das gleiche Problem wie hier beschrieben: https://github.com/facebook/jest/issues/2980. done() wird wegen des Fehlers nicht aufgerufen, so dass die Zeitüberschreitung erreicht ist. Das ist ok. Aber was nicht in Ordnung ist, ist, dass Jasmin/Jest den aufgetretenen Fehler melden sollte.jest: Fehlermeldung verloren mit Promise

Hinweis: Beispiel-Quellcode kann here gefunden werden.

Betrachten Sie die folgende Funktion, die eine Promise erzeugt, und ruft die done Rückruf, wenn das Versprechen behoben:

// file: foo.js 

function foo(done) { 
    const p = new Promise((resolve, reject) => { 
     setTimeout(() => { 
      //const xxx = 2; 
      resolve(xxx); 
     }, 100); 
    }); 
    p.then(data => { 
     console.log(data); 
     done() 
    }) 
} 

exports.foo = foo; 

Es enthält einen Fehler: die xxx Variable nicht definiert ist, so dass ein Fehler muss angehoben.

Wenn ich laufe Import diese Funktion und führen Sie es in einem Skript:

// file: index.js 

const foo = require('./foo').foo; 

foo(() => {}); 

und führen Sie das Skript mit node v8.6.0:

node index.js 

Ich erhalte den erwarteten Fehler (ReferenceError: xxx is not defined):

/home/dfroger/repo/dfroger/issue/jest-promise-error/foo.js:5 
      resolve(xxx); 
        ^

ReferenceError: xxx is not defined 
    at Timeout.setTimeout [as _onTimeout] (/home/dfroger/repo/dfroger/issue/jest-promise-error/foo.js:5:21) 
    at ontimeout (timers.js:469:11) 
    at tryOnTimeout (timers.js:304:5) 
    at Timer.listOnTimeout (timers.js:264:5) 

Wenn ich jetzt einen Komponententest fürschreibe 10:

// file: foo.test.js 

const foo = require('./foo').foo 

describe('async',() => { 
    it('run foo', done => { 
     foo(done); 
    }); 
}); 

Und es mit jest v21.2.1 laufen:

./node_modules/.bin/jest 

ich mehr und nicht die Fehlermeldung xxx being not defined über erhalten:

async 
    ✕ run foo (5004ms) 

    ● async › run foo 

    Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL. 

     at node_modules/jest-jasmine2/build/queue_runner.js:64:21 
     at ontimeout (timers.js:469:11) 
     at tryOnTimeout (timers.js:304:5) 
     at Timer.listOnTimeout (timers.js:264:5) 

Test Suites: 1 failed, 1 total 
Tests:  1 failed, 1 total 
Snapshots: 0 total 
Time:  5.574s, estimated 6s 
Ran all test suites. 

Habe ich vermisse jest verwendet? Ist es ein jest Bug? Wie kann ich sicherstellen, dass jest immer Fehlermeldungen korrekt melden?

Antwort

0

Sie haben Ihrem Versprechen keinen Catch-Block hinzugefügt; Obwohl ich es nicht alles ausprobieren kann, glaube ich, dass dies dein Problem ist;

// Datei: foo.js

function foo(done) { 
    const p = new Promise((resolve, reject) => { 
     setTimeout(() => { 
      //const xxx = 2; 
      resolve(xxx); 
     }, 100); 
    }); 
    p.then(data => { 
     console.log(data); 
     done() 
    }) 
    .catch(err => { 
     console.log(`Following error occured : ${err}`); 
    });  
} 

exports.foo = foo;