2017-11-24 1 views
0

Ich versuche, einen Code zu testen, der await und async mit Jest verwendet. Das Problem, das ich habe, ist eine Ausnahme, aber Jest scheint es nicht zu verstehen.Testen der async/await-Methode. Ausnahme wird nicht von Jest im Komponententest abgefangen

Zum Beispiel ist hier run Methode, die überprüft, ob session.url vorhanden ist. Wenn nicht, wird eine Ausnahme ausgelöst:

const args = require('args'); 
const fs = require('fs'); 
const { promisify } = require('util'); 

const readFile = promisify(fs.readFile); 

// Loads JSON configuration file 
module.exports.loadConfigFile = async (filename) => { 
    const contents = await readFile(filename, 'utf8'); 
    return JSON.parse(contents); 
}; 

// Prepare session ensuring command line flags override config 
module.exports.prepareSession = async (flags) => { 
    if(!flags.config) return flags; 
    const config = await this.loadConfigFile(flags.config); 
    return {...config, ...flags}; 
}; 

// Runs the race application 
module.exports.run = async (flags = {}) => { 
    const session = await this.prepareSession(flags); 
    if(!session.url) throw new Error('A valid URL is required'); 
}; 

Hier habe ich testen, ob eine Ausnahme ausgelöst wird:

describe('Race Module',() => { 
    test('Throws exception if no URL is provided', async() => { 
    const runner = await race.run(); 
    expect(runner).toThrowError(); 
    }); 

    ... 

Der Test läuft und es scheint eine Ausnahme ausgelöst wird, aber Scherz es nicht gefangen hat und es geht nicht:

Race Module 
    ✕ Throws exception if no URL is provided (3ms) 

● Race Module › Throws exception if no URL is provided 

A valid URL is required 

    at Object.<anonymous>.module.exports.run (src/race.js:23:27) 
     at <anonymous> 

Irgendwelche Ideen, wo ich falsch liege?

Mein erster Gedanke war, catch(() => {}) zu race.run() im Test zu ketten, aber ich bin nicht ganz sicher, wie ich das testen würde. Das könnte nicht einmal das Problem sein.

+1

Die 'await' wirft die Ausnahme von dem Versprechen, dass' run() 'kehrt zurück. 'runner' wäre das Ergebnis des Versprechens (der' return' Wert deiner async Funktion) – Bergi

+0

Ahhhh! Ich sehe jetzt. Vielen Dank. – BugHunterUK

Antwort

1

Die Lösung war rejects.toThrow zu verwenden. Beachten Sie jedoch, dass diese Funktionalität derzeit im Master unterbrochen ist. Ich musste einen Beta-Zweig benutzen. Siehe hier: https://github.com/facebook/jest/pull/4884

test('Throws exception if no URL is provided', async() => { 
    await expect(race.run()) 
     .rejects 
     .toThrow('A valid URL is required'); 
});