Первоначально опубликовано coreycleary.me . Это кросс-пост из моего содержимого блога. Я публикую новый контент каждую неделю или два, а вы может Зарегистрируйтесь на мою рассылку Если вы хотите получить мои статьи прямо на свой почтовый ящик! Я также регулярно отправляю Chechshseets и другие халявы.
Вы написали тесты для вашего Express App.
У вас есть большинство «счастливого пути» тестовых случаев. При нормальных обстоятельствах ваши API работает как ожидалось.
Но теперь вам нужно написать тест на то, как ваш API обрабатывает ошибку. Вы хотите проверить, что ваш API возвращает HTTP 500 Код состояния, например, если есть внутренняя ошибка сервера.
Проблема в том, что в рамках нормальных обстоятельств Ваш код не сталкивается с сценарием ошибок …
Итак, как вы запускаете один, чтобы вы могли написать этот тест и войти с помощью актуальных приложение код? Вместо того, чтобы вращать свои колеса выяснить, как написать Тест код!
Вот где вступит в игру. Давайте перейдем на это сейчас.
Задействовать ошибку
Вы могли бы услышать условия Шпион , заглушка или Макет до. Мы назовем эти коллективно подделки Отказ
Специфическая подделка, которую мы хотим использовать здесь заглушка – Это позволит нам переопределить функцию, которую мы хотим вызвать ошибку, чтобы мы могли проверить статус экспресс-ответа.
В этом случае, скажем, мы хотим проверить, что наш отдых API возвращает 500 Код ошибки при вызовах.
Давайте представим, что у нас есть маршрут /API/поиск , это позвонит в базу данных. Мы хотим посмотреть, что произойдет, когда этот звонок базы данных бросает ошибку. Когда это «пузырится» на экспресс-маршрут, что возвращено экспресс?
В нашем приложении поток кода идет HTTP-запрос —> Экспресс маршрут —> Контроллер —> Сервис —> База данных
Наш код базы данных выглядит следующим образом:
const search = async (term, numToFetch = null) => {
return db.select('*').from('item').where('name', 'like', `%${term}%`).limit(numToFetch)
}
export {
search
}
Поиск Призывается сервис, который называется контроллером, который называется маршрутом.
Синон к спасению
Итак, как мы на самом деле используем заглушку, чтобы подделать ошибку?
Это где Синон И его острубиная способность приходит к спасению.
Мы можем «подделать» ошибку, используя SINON, делая что-то вроде:
sinon.stub(module, 'functionToStub').throws(Error('error message'))
Так что в нашем случае тест маршрута Экспресса будет выглядеть так:
import request from 'supertest'
import sinon from 'sinon'
import app from '../../app'
import * as itemQueries from '../../db/queries/item.query'
describe('/api/search route', () => {
it('should return a 500 when an error is encountered', async () => {
// stub an error
sinon.stub(itemQueries, 'search').throws(Error('db query failed'))
await request(app) // pass Express app to supertest
.post('/api/search') // call Express route we want to test
.send({term: 'blah', num: 1}) // pass normally expected, valid data in request body
.expect(500) // assert that we return a HTTP 500 response status code
})
})
В приведенном выше тесте мы утверждаем о состоянии состояния – .expect (500) – Потому что если файл базы данных не удается и бросает ошибку (может быть, база данных, например), мы ожидаем, что вернется 500 внутренний сервер Код ошибки к абоненту API.
Упаковка
Оборучая фальшивую ошибку в тестовом коде, вы можете избежать жесткой ошибки в вашем приложении и Имимический сценарий ошибки реального мира.
С помощью этого тестового корпуса охватывается, это дает ваше приложение гораздо больше надежности.
И вам не просто придется подделать ошибку на уровне базы данных, вы можете сделать это в любом месте в вашем приложении. Вы даже можете Мачные звонки на внешние услуги, которые у вас нет!
Love JavaScript, но все еще отключается по тестам подразделения/интеграции? Я публикую статьи на JavaScript и узел каждые 1-2 недели, поэтому, если вы хотите получить все новые статьи непосредственно в свой почтовый ящик, Вот эта ссылка снова Подписаться на мою рассылку!
Оригинал: “https://dev.to/ccleary00/faking-errors-to-test-error-scenarios-in-express-api-s-3m9n”