Как заставить 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.
Любые предложения?
Я нашел решения для этого в аналогичном вопросе. Этот вопрос написан, потому что эти решения, похоже, не работают для меня.
Ответы
Ответ 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