2017-05-05 3 views
0

Ich schreibe einen Komponententest, um mein Postgres-Schema zu testen. Ich benutze Knoten-Pg, Mocha, Sinon und Chai.Der Test wird nicht beim Beenden fehlgeschlagen.

Dies funktioniert - der Test bestanden ohne Probleme:

describe('When adding a user',()=> { 
    it('should reject since email is used somewhere else', (done)=> { 
    pool.query(`INSERT INTO users(email, id, token) 
       VALUES($1, $2, $3)`, ['[email protected]', '12346', 'fooToken']) 
    .then((result)=> { 
     console.log('nothing in here runs, you will not see this'); 
     done() 
    }) 
    .catch((result) => { 
     result.constraint.should.have.string('email_already_exists'); 
     done(); 
    }) 
    }) 
}); 

aber sicherzustellen, dass ich nicht falsch positiv bin immer, ändere ich die assert result.constraint.should.not.have.string('email_already_exists'); um absichtlich den Test zu machen scheitern.

Anstelle des Tests fehlgeschlagen, bekomme ich Error: timeout of 2000ms exceeded. Ensure the done() callback is being called in this test..

Was bekomme ich das?

+1

Wenn Sie promisebasierten Code testen, sollten Sie in Betracht ziehen, Mochas integrierte [Versprechen Unterstützung] (https://mochajs.org/#working-with-promises) zu verwenden. Viel einfacher, solche Probleme zu verhindern. – robertklep

+0

@robertklep Wie könnte diese Versprechensunterstützung beim Testen von 2 Abrufen im Knoten verwendet werden? http://stackoverflow.com/questions/43690868/how-to-assert-stubbed-fetch-more-than-once/43806205#43806205 – dman

+1

Ein gutes Beispiel: https://coderwall.com/p/axugwa/cleaning- the-database-in-between-mocha-tests-mit-pg-promise –

Antwort

1

Wenn Sie noch Versprechungen für diese verwenden mögen, ist das Problem, dass nicht behandelte Ausnahmen in Promises sind leider nicht weitergegeben, sondern stillschweigend ignoriert werden. Als Ergebnis ruft niemand die done Methode von Mocha an, was zu dem Timeout führt.

Das Anhängen eines Listeners an Node unhandledRejection Ereignis wie dokumentiert here sollte dies demonstrieren.

Wenn Sie Ihren ursprünglichen Code ändern und einen Aufruf an die done Methode Versprechen hinzufügen (dies ist nicht Mocha der ist done Methode!), Dann werden Sie in der Lage sein, alle Fehler zu fangen und sie an done Methode des Mokka:

it('tests something', done => { 
    pool.query('...') 
    .then(result => { 
     // ... 
    }) 
    .catch(result => { 
     // assertion that fails 
    }) 
    .done(result => {}, error => { done(error); }); 
}); 

Beachten Sie, dass Promise.done() (noch) nicht Teil des Standards ist, aber dennoch von vielen Implementierungen unterstützt wird. Siehe zum Beispiel here.

0

Antwort:

Das Versprechen Kette für Knoten-pg verursacht diese seltsame Frage während Tests. Wenn ich weg von Rückruf arbeitet, dann kein Problem:

describe('When adding a user',()=> { 
    it('should reject since email is used somewhere else', (done)=> { 
    function callback(err, result) { 
     err.constraint.should.not.have.string('email_already_exists'); 
     done(); 
    } 
    pool.query(`INSERT INTO users(email, id, token) 
       VALUES($1, $2, $3)`, ['[email protected]', '12346', 'fooToken'], callback) 
    }) 
}); 
Verwandte Themen