2016-03-24 4 views
2

Ich mache einige Unit-Tests Node.js mit und ich möchte einen Test wie dies zum Scheitern verurteilt:Wie kann ich einen Knoteneinheitstest beim Abfangen eines Versprechens nicht bestehen?

doSomething() 
    .then(...) 
    .catch(ex => { 
     // I want to make sure the test fails here 
    }); 

Ich bin mit Assert, so fand ich Assert.Fails. Das Problem ist, dass failsactual und expected erwartet, die ich nicht habe. Die Node-Dokumentation sagt nichts darüber aus, dass sie benötigt werden, aber die Chai documentation, die Node-konform ist, sagt, dass sie es sind.

Wie soll ich nicht einen Test auf den catch ein Versprechen?

+0

Für eine semantische Versagen, möchten Sie wahrscheinlich mit einem Spion der 'catch' Rückruf schauen in Einwickeln, dann macht es aus, wenn der Spion genannt wird. –

+0

@DanPrince, danke, kannst du mitarbeiten? –

+0

@DanPrince. Ich denke, ich verstehe. Du meinst, ich erstelle eine "fail" -Funktion, die eine Ausnahme auslöst, als ich passiere "fail", um zu fangen –

Antwort

1

Wenn Sie mocha verwenden, dann elegante Art und Weise wäre, wie folgend:

describe('Test',() => { 
    it('first', (done) => { 
    doSomething() 
    .then(...) 
    .catch(done) 
    }) 
}) 

Wenn Ihr Versprechen scheitert, wird done Methode mit der ausgelösten Exception als Parameter aufgerufen werden, so angezeigten Code entspricht

In mocha Aufruf von done() mit dem Parameter schlägt fehl den Test.

1

Haben Sie Assert.Ok (false, message) berücksichtigt? Es ist knapper.

Assert.fail sucht nach einem Vergleich und zeigt zusätzliche Informationen an.

+0

Das würde funktionieren, aber ist das nicht hässlich? Es ist wie ein if (false) :( –

+0

Ja, hässlich, oder Sie können sich die Assert-Objekt erweitern und eine bessere Methode schreiben. Assert.Now (Nachricht) –

3

Sie können eine eigene Spione Bibliothek verwenden, wie Sinon, oder Sie können eine einfache Spion selbst implementieren.

function Spy(f) { 
    const self = function() { 
    self.called = true; 
    }; 
    self.called = false; 
    return self; 
} 

Der Spion ist nur eine Wrapper-Funktion, die Daten darüber aufzeichnet, wie die Funktion aufgerufen wurde.

const catchHandler = ex => ...; 
const catchSpy = Spy(catchHandler); 

doSomething() 
    .then(...) 
    .catch(catchSpy) 
    .finally(() => { 
    assert.ok(catchSpy.called === false); 
    }); 

Das Grundprinzip ist auf den Fang Rückruf auszuspionieren, dann verwenden Sie die finally clause Ihrer Versprechen, um sicherzustellen, dass der Spion genannt worden ist.

+0

Dank .. Sie verwenden nicht 'f'anywhere innen' Spy (f) ', ist das absichtlich? –

+0

Ich habe Ihre Antwort uplooted aber akzeptiert die andere. Vielen Dank für Ihre Zeit. –

+0

@andrerpena Ich verließ 'f' dort zu zeigen, dass Sie es in den Spion verwenden könnten, wenn Sie wollten, aber in diesem Fall, alles, was Sie wissen mussten, war, ob es angerufen wurde. –

Verwandte Themen