У меня проблемы с тем, чтобы Chai's expect.to.throw
работал в тесте для моего приложения node.js. Тест продолжает давать сбой на выданную ошибку, но если я оберну тестовый пример в попытку и поймать и утверждать на обнаруженную ошибку, это работает.
Не expect.to.throw
работает, как я думаю, что должно или что-то?
it('should throw an error if you try to get an undefined property', function (done) {
var params = { a: 'test', b: 'test', c: 'test' };
var model = new TestModel(MOCK_REQUEST, params);
// neither of these work
expect(model.get('z')).to.throw('Property does not exist in model schema.');
expect(model.get('z')).to.throw(new Error('Property does not exist in model schema.'));
// this works
try {
model.get('z');
}
catch(err) {
expect(err).to.eql(new Error('Property does not exist in model schema.'));
}
done();
});
Провал:
19 passing (25ms)
1 failing
1) Model Base should throw an error if you try to get an undefined property:
Error: Property does not exist in model schema.
источник
model
Экземпляр имеет функцию с именем get, которую я передал / вызвал в ожидаемом.to.throw
тестирования - это тестирование определенного условия внутри функции, которое требует вызова этой функции с недопустимым состоянием / аргументами. (В этом отношении .... почему не глубокие ссылки chaijs.com на самом деле Deeplink?)Как говорится в этом ответе , вы также можете просто обернуть свой код в анонимную функцию, например:
источник
expect(function(){ model.get('z'); }).to.throw('Property does not exist in model schema.').notify(done);
как нет способа уведомления.catch (err) { expect(err).equal('Error message to be checked'); done(); }
this
внутри вызываемой функции. Тогда.bind
это правильный путь.И если вы уже используете ES6 / ES2015, то вы также можете использовать функцию стрелки. По сути, это то же самое, что и обычная анонимная функция, но короче.
источник
this
this
от области, в которой они были созданы. Зачастую это может быть преимуществом, поскольку позволяет избежать необходимости вручную вводитьbind
функции для своегоthis
объекта.bind
и всегда привязки кthis
родительской области видимости. Мое намерение в комментарии было только для того, чтобы читатели знали о возможном падении ямы.Этот вопрос имеет много-много дубликатов, включая вопросы, не упоминающие библиотеку утверждений Чай. Вот основы, собранные вместе:
Утверждение должно вызывать функцию, а не вычислять ее немедленно.
Вы можете проверить наличие конкретных ошибок, используя любую библиотеку утверждений:
Узел
Должен
Чай Ожидать
Вы должны обрабатывать исключения, которые «избегают» теста
На первый взгляд это может показаться странным. Как и при езде на велосипеде, он просто «щелкает» вечно, когда щелкает.
источник
примеры из док ...;)
потому что вы полагаетесь на
this
контекст:Вы должны использовать один из следующих вариантов:
связать контекст
источник
Еще одна возможная реализация, более громоздкая, чем решение .bind (), но та, которая помогает понять, что ожидаемо () требует функции, которая предоставляет
this
контекст для покрытой функции, вы можете использоватьcall()
, например,expect(function() {model.get.call(model, 'z');}).to.throw('...');
источник
Я нашел хороший способ обойти это:
Это намного более читабельно, чем моя старая версия:
источник