JavaScript

Создание приложения на Vue.js по TDD – обширное руководство для людей, у которых есть время – часть 4

Spread the love

Оригинальная статья: Daniel KuroskiWorking an application in Vue.js with TDD — An extensive guide for people who have time — part 4

Это четвертая часть в серии статей:

В прошлой статье мы завершили все тесты наших компонентов и затем интегрировались с хранилищем, и вероятно, это было самой обширной и важной частью этой серии.

Теперь перейдем к последней части приложения, которое необходимо протестировать, — службе, отвечающей за обработку запросов к Github api.

Тестирование сервиса запросов API

tests/unit/api.spec.js

import flushPromises from 'flush-promises'
import nock from 'nock'
import api from '@/api'
import userFixture from './fixtures/user'

describe('api', () => {
  it('searches for the user', async () => {
    // arrange
    const expectedUser = 'kuroski'

    const request = nock('https://api.github.com')
      .get(`/users/${expectedUser}`)
      .reply(200, userFixture)

    // act
    const result = await api.searchUser(expectedUser)
    await flushPromises()

    // assert
    expect(result).toEqual(userFixture)
    expect(request.isDone()).toBe(true)
  })
})

Это наш последний тест. Единственное отличие от того, что было до сих пор, заключается в использовании новой зависимости, которую мы установили в начале проекта nock.

По сути, эта библиотека позволяет вам тестировать http-запросы изолированно. В этом случае мы можем указать URL-адрес, и если для него сделать запрос, nock перехватит его и обработает так, как вы укажите.

В нашем случае в строки 11 мы указали nock для наблюдения любого запроса GET для URL: https://api.github.com/users/:username, далее nock перехватит это и возвращает ответ со статуса 200 с нашей fixture.

Затем мы вызываем наш сервисный метод, передавая пользователя используем flushPromise, чтобы гарантировать, что все promises будут «резолвены» с этого момента.

Для фазы asserts мы хотим гарантировать, что результатом нашего сервиса будет наша userFixture, гарантируя таким образом, что был сделан запрос на ожидаемый URL, который мы mocking с nock.

Наконец, мы хотим гарантировать, что был вызван mocked URL в nock.

RED

Наш тест провалится, так как у нас пока нет никакой реализации. Давайте сделаем это.

src/api.js

import axios from 'axios'
import httpAdapter from 'axios/lib/adapters/http'

const instance = axios.create({
  baseURL: 'https://api.github.com',
  adapter: httpAdapter,
})

export default {
  searchUser(username) {
    return instance
      .get(`/users/${username}`)
      .then(result => result.data)
  }
}

Наконец, у нас есть наш сервис, чтобы делать запросы.

Мы используем axios, библиотеку, которая помогает нам делать HTTP-запросы.

В строке 4 мы создаем экземпляр axios для запросов к API Github.

Адаптер, который мы передали в качестве конфигурации, необходим для того, чтобы мы могли использовать axios с nock. Это позволяет нам настроить то, как axios обрабатывает запросы, поэтому nock может перехватывать эти запросы.

В строке 10 у нас есть наш метод, который получает имя пользователя, и возвращает запрос GET для API Github.

В строке 13 мы получаем ответ на запрос и возвращаем свойства data запроса. Я делаю это здесь, потому что axios меняет результат и инкапсулирует ответ в этом свойстве.

Таким образом, мы завершили все тесты в нашем приложении.

GREEN!!!

Давайте посмотрим, как это работает?

Теперь мы можем наконец увидеть результат нашей работы. Запустим команду:

npm run serve
Abra em http://localhost:8080/

Что мы видим?

WHITE

Совершенно ничего! Но … конечно, нам нужно создать маршрут для нашего компонента 😆

src/router.js

import Vue from 'vue'
import Router from 'vue-router'
const UserView = () => import('@/views/UserView')

Vue.use(Router)

export default new Router({
  mode: 'history',
  base: process.env.BASE_URL,
  routes: [
    {
      path: '/',
      component: UserView
    }
  ]
})

Готово. Вот и все:

Помните, что мы также можем тестить маршруты. Мы можем создать тест, чтобы гарантировать, что у нас есть ожидаемые маршруты вместе с guard, в случае необходимости, но мы не будем делать это прямо сейчас.

В итоге мы получили полное приложение, практически не видя его. И что самое лучшее, у нас все основные части, полностью покрыты тестами 😍


Заключение

В этой четвертой статье мы сделали:

  • Мы протестировали сервис, отвечающий за отправку запросов на Github
  • Мы завершили наше приложение 😃

Я рекомендую, если у вас есть интерес, заглянуть в сторонние репозитории, используемые в этом приложении:

Поскольку есть ряд функций, которые мы можем использовать с этими библиотеками, а также не ограничиваясь ими, существуют другие библиотеки, которые выполняют такую же работу, например: jest-axios-mock.

Также в качестве предупреждения, рассмотренный способ тестирования не заменяет интеграционные и e2e-тесты. Мы гарантировали, что приложение будет работать, при определенном API которое возвращает то, что мы ожидаем. Если когда-нибудь Github изменить свое API, изменит его адрес или изменит его формат ответа (это крайне неправильно), наше приложение сломается.

В следующей статье мы добавим стороннюю библиотеку компонентов и обновим наши тесты для ее использования.

Следующая часть
Твиттер автора оригинальной статьи : @DKuroski

Была ли вам полезна эта статья?
[2 / 5]

Spread the love
Editorial Team

Recent Posts

Vue 3.4 Новая механика v-model компонента

Краткий перевод: https://vuejs.org/guide/components/v-model.html Основное использование​ v-model используется для реализации двусторонней привязки в компоненте. Начиная с Vue…

12 месяцев ago

Анонс Vue 3.4

Сегодня мы рады объявить о выпуске Vue 3.4 «🏀 Slam Dunk»! Этот выпуск включает в…

12 месяцев ago

Как принудительно пере-отобразить (re-render) компонент Vue

Vue.js — это универсальный и адаптируемый фреймворк. Благодаря своей отличительной архитектуре и системе реактивности Vue…

2 года ago

Проблемы с установкой сертификата на nginix

Недавно, у меня истек сертификат и пришлось заказывать новый и затем устанавливать на хостинг с…

2 года ago

Введение в JavaScript Temporal API

Каким бы ни было ваше мнение о JavaScript, но всем известно, что работа с датами…

2 года ago

Когда и как выбирать между медиа запросами и контейнерными запросами

Все, кто следит за последними событиями в мире адаптивного дизайна, согласятся, что введение контейнерных запросов…

2 года ago