Тестирование функции, которая была возвращена обещанием - проверка на ошибки
Я тестирую функцию, которая возвращается как часть обещания. Я использую Чай как обещано.
Я могу проверить, работает ли эта функция, но я не могу проверить, правильно ли она выдает ошибки.
Функция, которую я пытаюсь протестировать, оставляя много кода, связанного с обещанием:
// function that we're trying to test
submitTest = (options) => {
// missingParam is defined elsewhere. It works - the error is thrown if screenshot not passed
if (missingParam(options.screenShot)) throw new Error('Missing parameter');
return {};
}
Мои тесты:
describe('SpectreClient()', function () {
let client;
before(() => client = SpectreClient('foo', 'bar', testEndpoint));
// the client returns a function, submitTest(), as a part of a promise
/*
omitting tests related to the client
*/
describe('submitTest()', function () {
let screenShot;
before(() => {
screenShot = fs.createReadStream(path.join(__dirname, '/support/test-card.png'));
});
// this test works - it passes as expected
it('should return an object', () => {
const submitTest = client.then((response) => {
return response.submitTest({ screenShot });
});
return submitTest.should.eventually.to.be.a('object');
});
// this test does not work - the error is thrown before the test is evaluated
it('it throws an error if not passed a screenshot', () => {
const submitTest = client.then((response) => {
return response.submitTest({});
});
return submitTest.should.eventually.throw(Error, /Missing parameter/);
});
});
})
Выход теста -
// console output
1 failing
1) SpectreClient() submitTest() it throws an error if not passed a screenshot:
Error: Missing parameter
Как мне проверить, что ошибка выброшена корректно? Я не уверен, является ли это проблемой мокко или обещанием или обещанием. Помощь высоко ценится.
1 ответ
Исключения, возникающие в обработчиках обещаний, преобразуются в отклонения обещаний. submitTest
выполняется внутри обратного вызова client.then
и, следовательно, исключение, которое оно вызывает, становится отказом от обещания.
Так что вы должны сделать что-то вроде:
return submitTest.should.be.rejectedWith(Error, /Missing parameter/)