web-dev-qa-db-fra.com

Comment faire échouer un test à Mocha

J'ai le test suivant:

it.only('validation should fail', function(done) {
    var body = {
        title: "dffdasfsdfsdafddfsadsa",
        description: "Postman Description",
        beginDate: now.add(3, 'd').format(),
        endDate: now.add(4, 'd').format()
    }


    var rules = eventsValidation.eventCreationRules();
    var valMessages = eventsValidation.eventCreationMessages();

    indicative
        .validateAll(rules, body, valMessages)
        .then(function(data) {
            console.log("SHOULD NOT GET HERE");
            should.fail("should not get here");
            done();

        })
        .catch(function(error) {
            console.log("SHOULD GET HERE");
            console.log(error);
        });
    done();
});

Le chemin d'exécution du test est correct. Lorsque j'ai des données de validation, cela passe à "NE DEVRAIT PAS OBTENIR ICI". Le test est vraiment de s'assurer que ce n'est pas le cas. Et lorsque je mets des données non validantes, le code passe à "DEVRAIT OBTENIR ICI". Les règles de validation fonctionnent donc.

Ce que j'essaie de faire, c'est de m'assurer que le test échoue lorsque j'ai de mauvaises données de validation et qu'il valide. Cependant, lorsque je l'exécute tel quel avec de bonnes données, il valide, exécute l'échec, mais mocha le marque toujours comme étant le passage. Je veux qu'il échoue si l'exécution arrive à "NE DEVRAIT PAS OBTENIR ICI".

J'ai essayé de lancer une nouvelle erreur ("échec"); ainsi sans chance. Dans les deux cas, il semble également exécuter le code dans le bloc .catch.

Aucune suggestion? J'ai trouvé des solutions pour cela dans une question similaire . Cette question est écrite parce que ces solutions ne semblent pas fonctionner pour moi.

25
Robin Masters

Utilisation chai-as-promised, avec des gestionnaires de promesses natifs Mocha.

var chai = require('chai').use(require('chai-as-promised'));
var should = chai.should(); // This will enable .should for promise assertions

Vous n'avez plus besoin de done, renvoyez simplement la promesse.

// Remove `done` from the line below
it.only('validation should fail', function(/* done */) {
    var body = {
        title: "dffdasfsdfsdafddfsadsa",
        description: "Postman Description",
        beginDate: now.add(3, 'd').format(),
        endDate: now.add(4, 'd').format()
    }

    var rules = eventsValidation.eventCreationRules();
    var valMessages = eventsValidation.eventCreationMessages();

    // Return the promise
    return indicative
        .validateAll(rules, body, valMessages)
        .should.be.rejected; // The test will pass only if the promise is rejected

    // Remove done, we no longer need it
    // done();
});
14
Yuri Zarubin

Vous pouvez appeler assert.fail :

it("should return empty set of tags", function()
{
    assert.fail("actual", "expected", "Error message");
});

En outre, Mocha considère que le test a échoué si vous appelez la fonction done() avec un paramètre.

Par exemple:

it("should return empty set of tags", function(done)
{
    done(new Error("Some error message here"));
});

Bien que le premier me semble plus clair.

40
MondKin

Dans l'ES2017 async / await world chai-as-promised n'est pas autant nécessaire. Bien que les rejets simples soient un endroit chai-as-promised reste un peu plus propre à utiliser, un catch est requis si vous voulez tester l'erreur plus en détail.

it.only('validation should fail', async function(){
    let body = { ... }
    let rules = eventsValidation.eventCreationRules()
    let valMessages = eventsValidation.eventCreationMessages()

    try {
        await indicative.validateAll(rules, body, valMessages)
    } catch (error) {
        expect(error).to.be.instanceOf(Error)
        expect(error.message).to.match(/Oh no!/)
        return
    }
    expect.fail(null, null, 'validateAll did not reject with an error')
    // or throw new Error('validateAll did not reject with an error')
})

async / await nécessite Node.js 7.6 + ou un compilateur comme Babel

8
Matt

Ce simple lancer fonctionne pour moi

describe('Lead', () => {
  it('should create a new lead', async () => {
     throw 'not implemented'
  })
})
5
Alex Smirnov