e2e тесты можно проводить как на АПИ, так и через браузер (фронт-приложение)
Тестирование АПИ:
Jest
Mocha
Chai
Тестирование фронта:
Cypress
Protractor
Selenium
Для интеграционного тестирования нам не обязательно поднимать всё приложение. Тут достаточно поднять два инстанса
Для юнита нужно лишь вписать тесты под отдельный модуль
002 Тесты отзывов
e2e тесты хранятся в папке test. Там же находится файл настроек, где и указано, какие тесты должен запускать Jest
Далее уже в той же папке лежит и сам e2e тест приложения.
describe - описывает запускаемую группу тестов
beforeEach - функция, которая выполняется до каждого отдельного теста
beforeAll - выполняется один раз перед всеми тестами
afterAll - выполняется один раз после всех тестов
it - описывает действия на каждом отдельном тесте
app - переменная, которая получает из moduleFixture (переменная с модулями для теста) всё целиковое приложение
Test.createTestingModule - фиксирует ровно те модули в приложении, которые нам нужно запустить (конкретно тут вызвается всё приложение)
request - маленькая библиотечка из supertest, которая позволяет удобно общаться с локальным АПИ
test > review.e2e-spec.ts
Далее напишем несколько тестов. Хорошей практикой будет писать тесты как на успешное выполнение операции, так и на выполнение с ошибкой.
Внутри it:
пишем имя теста по определённой нотации
если мы будем использовать внутри ответа then, то функция должна быть async
первым делом, мы через request(app.getHttpServer()) получаем доступ к нашему локальному хосту для запросов
далее у нас идёт сам запрос (post, get, delete и так далее). В него всталяем роут запроса (без использования пути относительно глобального префикса через app.setGlobalPrefix(), так как будет ошибка)
дальше мы можем вписать send(), если нам нужно что-то отправить на сервер
дальше вписать expect(), в котором находится ожидаемый ответ от сервера
дальше уже можно поместить then((res: request.Respone) => {}), в котором нужно провести определённые операции проверки (expect())
test > review.e2e-spec.ts
003 Unit тесты
И изначально при создании любого объекта через нест, у нас создаются начальные тесты
src > review > review.service.spec.ts
Однако они работать не будут, так как в тесты нужно ещё будет вложить все зависимости, которые инжектятся в сервис
Для исправления вышеописанной проблемы нужно будет замокать все зависимости
Через getModelToken('ReviewModel') мы просим тайпгуз, чтобы он от зависимости ReviewModel нашёл её токен и по нему нужно будет заинжектить некоторую новую фабрику
Далее нам нужно описать работу reviewRepositoryFactory. Он возвращает объект с функциями. Чтобы работал чейн, как в оригинальных функциях, нужно, чтобы его функции возвращали exec. Сам exec представляет из себя объект, который хранит функцию-заглушку jest.fn()
Теперь мы можем воспользоваться большим количеством моковых данных
И примерно так выглядит реализация unit-теста с с фабрикой, которая генерирует нам моковые методы: