Следующий тест ведет себя странно:
it('Should return the exchange rates for btc_ltc', function(done) {
var pair = 'btc_ltc';
shapeshift.getRate(pair)
.then(function(data){
expect(data.pair).to.equal(pair);
expect(data.rate).to.have.length(400);
done();
})
.catch(function(err){
//this should really be `.catch` for a failed request, but
//instead it looks like chai is picking this up when a test fails
done(err);
})
});
Как правильно обработать отклоненное обещание (и проверить его)?
Как правильно обрабатывать неудачный тест (например expect(data.rate).to.have.length(400);
:?
Вот реализация, которую я тестирую:
var requestp = require('request-promise');
var shapeshift = module.exports = {};
var url = 'http://shapeshift.io';
shapeshift.getRate = function(pair){
return requestp({
url: url + '/rate/' + pair,
json: true
});
};
Ensure the done() callback is being called in this test
об ошибке при попытке сделать это с помощью Mocha 2.2.5.done
параметр,it
который мог бы отказаться от него.done
в моемit
обратном вызове и явный вызовreturn
(в обещании) в обратном вызове - вот как я это сделал, как в фрагменте кода.Alternately, instead of using the done() callback, you may return a Promise. This is useful if the APIs you are testing return promises instead of taking callbacks:
done
it
Как уже указывалось здесь , более новые версии Mocha уже поддерживают Promise. Но так как ОП спрашивал конкретно о Чай, было бы справедливо указать на
chai-as-promised
пакет, который обеспечивает чистый синтаксис для тестирования обещаний:используя чай как обещал
Вот как вы можете использовать chai-as-обещано, чтобы проверить оба
resolve
иreject
дела для Обещания:без чая как обещал
Чтобы прояснить, что тестируется, вот тот же пример, кодированный без chai-as-обещано:
источник
catch
он вызывается приexpect(s)
сбое. Это создает неправильное впечатление, что обещание не удалось, хотя оно и не было. Это только ожидание, которое не удалось.Chai.use
чтобы смонтировать его Я бы никогда не узнал об этом из документации, которую они имели. | :(Вот мой дубль:
async/await
Функция отложенного обещания, которая завершается ошибкой, если задана задержка 0:
Положительный тест довольно прост. Неожиданный сбой (имитировать
500→0
) автоматически провалит тест, так как отклоненное обещание возрастает.Отрицательный тест использует try-catch-idea. Однако «жалоба» на нежелательный проход происходит только после предложения catch (таким образом, он не заканчивается в предложении catch (), вызывая дальнейшие, но вводящие в заблуждение ошибки.
Чтобы эта стратегия работала, необходимо вернуть тест из предложения catch. Если вы не хотите ничего тестировать, используйте другой блок it ().
источник
Это лучшее решение. Просто верните ошибку с done в блоке catch.
этот тест не пройдёт со следующим сообщением:
AssertionError: expected 1 to equal 11
источник