Подтвердить что ты не робот

Как заставить 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();
});

Правильный путь выполнения теста. Когда я проверяю данные, он переходит в "НЕ ДОЛЖЕН ПОЛУЧИТЬ ЗДЕСЬ". Тест действительно должен убедиться, что это не так. И когда я добавляю не проверяющие данные, код действительно переходит в "ДОЛЖЕН ПОЛУЧИТЬ ЗДЕСЬ". Поэтому действуют правила проверки.

То, что я пытаюсь сделать, это убедиться, что тест завершился неудачно, когда у меня есть плохие данные проверки и он проверяет. Однако, когда я запускаю его, так как он с хорошими данными, он проверяет, запускает сбой, но мокко по-прежнему отмечает его как прохождение. Я хочу, чтобы он потерпел неудачу, если выполнение переходит к "НЕ ДОЛЖНО ЗДЕСЬ".

Я попробовал сбросить новую ошибку ( "fail" ); а также не повезло. В обоих случаях он действительно запускает код в блоке .catch.

Любые предложения? Я нашел решения для этого в аналогичном вопросе. Этот вопрос написан, потому что эти решения, похоже, не работают для меня.

4b9b3361

Ответ 1

Используйте chai-as-promised, с собственными обработчиками обещаний Mocha.

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

Ответ 2

Вы можете вызвать 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"));
});

Хотя первый выглядит мне более ясным.

Ответ 3

В ES2017 async/await мир chai-as-promised не нужен. Хотя простые отклонения - это одно место chai-as-promised, остается немного опрятным для использования, эта следующая настройка требуется, если вы хотите более подробно протестировать ошибку

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) {
        return expect(error).to.be.instanceOf(Error)
    }
    expect.fail(null, null, 'validateAll did not reject with an error')
    // or throw new Error('validateAll did not reject with an error')
})

Требуется Node.js 7.6+ или Babel