web-dev-qa-db-ja.com

Mochaをテストに失敗させる方法

次のテストがあります。

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();
});

テスト実行パスは正しいです。データを検証すると、「ここに来ないでください」に進みます。テストは、実際にそうではないことを確認することです。そして、検証していないデータを入力すると、コードは「SHOULD GET HERE」に移動します。したがって、検証ルールは機能します。

私がやろうとしているのは、検証データが間違っていて検証するときにテストが失敗することを確認することです。ただし、適切なデータを使用してそのまま実行すると、検証され、失敗しますが、mochaはそれを合格としてマークします。実行が「ここに来るべきではない」場合に失敗するようにしたい。

私は新しいエラー(「失敗」)をスローしようとしました。同様に運がありません。どちらの場合でも、実際には.catchブロックのコードも実行するようです。

助言がありますか? 類似の質問 でこれに対する解決策を見つけました。この質問は、これらのソリューションが役に立たないように思われるために書かれています。

25
Robin Masters

つかいます chai-as-promised、ネイティブMocha promiseハンドラー。

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

doneは不要になり、単純にプロミスを返します。

// 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

_assert.fail_ を呼び出すことができます:

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

また、Mochaは、パラメーターを使用してdone()関数を呼び出すと、テストが失敗したと見なします。

例えば:

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

最初のものは私にはより明確に見えますが。

40
MondKin

ES2017では async / await 世界chai-as-promisedはそれほど必要ありません。単純な拒否は1つの場所ですがchai-as-promisedは少し使いやすいままです。エラーをより詳細にテストする場合は、catchが必要です。

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 が必要 Node.js 7.6 + または Babel のようなコンパイラ

8
Matt

このシンプルなスローは私のために働いています

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