Привет всем, пытаюсь сейчас написать первые тесты в своей жизни)
Из этого появилось много вопросов:
1) У меня есть большой сервис, который взаимодействует напрямую с репозиториями из других компонентов.
Is it ok? если нет, то как лучше?
2) Когда хотел написать unit test для одного большого метода в этом сервисе, столкнулся с проблемой мокинга репозиториев. У меня есть специфичные запросы вроде:
await this.otherComponentRepository.findOne({
where: { message: Raw((alias) => `${alias} ILIKE '${code}'`) },
lock: { mode: 'pessimistic_write' }
})
Просто так замокать findOne не получится, ниже он используется еще раз, но уже с другим FindOptions.
Нормально ли будет, если я для каждого такого findOne закину в OtherComponentRepository отдельную функцию, чтобы ее можно было замокать? Назову ее например findOneByMessageWithLock. Есть ли другие варианты? Как это делаете вы?
3) Дополняя 2й вопрос: подозреваю, что такие вещи вообще нужно закидывать не в репозиторий, а в сервис (кстати, почему так делают? зачем findOneByMessageWithLock в сервисе, если можно в репозитории).
4) Если нужно в сервис, то как жить с огромным количеством мелких функций вроде findOneByMessageWithLock в сервисе и при этом еще иметь огромные функции с огромным flow бизнес-логики.
5) Есть ли какой-то материал на habr/medium где все такие глупые вопросы уже решены? Есть ли репозиторий с нормальными примерами тестов на nest и typeorm, где не калькулятор тестируется.
6) Что делать, если мне в одном тесте нужно, чтобы findOneByMessageWithLock вернул одну запись, а в другом другую? Как подменять моки между тестами?
7) Стоит ли тратить время на юнит-тесты или проще сразу e2e? Хочется покрыть код тестами быстрее, о TDD в момент написания бекенда я даже не задумывался.
8) Jest проводит много e2e-тестов одновременно, как шарить между ними одну базу? Ведь нужно, чтобы тесты были независимы друг от друга.