Когда я писал API в экспрессе (node), у меня была идея автоматизировать тестовые случаи живых API; после некоторых исследований я получил некоторую информацию и понимание, а также один дополнительный пакет зависимостей в моем проекте. 😁🤭

Окей! теперь давайте меньше говорить и больше писать :)

Во-первых, создание нового проекта с помощью терминала с помощью команды add npm init:

npm init

После того, как вы должны добавить некоторые подробности о пакете, например:

Вы можете писать туда все, что хотите. На этом этапе создается наш package.json. Добавьте все детали и нажмите Enter… Теперь у нас есть наш package.json в корне нашего каталога.

Во-вторых, мы должны установить пакеты axios, chai и nock в наш проект, чтобы начать с ними работать.

npm i axios
npm i mocha chai nock -D

Я добавил -D с mocha/nock/chai, потому что они мне нужны только в режиме разработки, теперь немного об этих пакетах:

Mocha — это многофункциональная среда тестирования JavaScript, работающая на Node.js и в браузере, которая делает асинхронное тестирование простым и увлекательным.

Нажмите здесь, чтобы получить дополнительную информацию

Axios — это HTTP-клиент на основе обещаний для node.js и браузера. Он изоморфен (= он может работать в браузере и на nodejs с одной и той же кодовой базой).

Нажмите здесь, чтобы получить дополнительную информацию

Chai — это библиотека утверждений BDD/TDD для [node](http://nodejs.org) и браузера, которую можно прекрасно сочетать с любой средой тестирования JavaScript.

Нажмите здесь, чтобы получить дополнительную информацию

Nock — это библиотека для насмешек и ожиданий HTTP-сервера для Node.js. Nock можно использовать для тестирования модулей, которые выполняют HTTP-запросы изолированно, я расскажу об одной из его функций, поэтому, если вы хотите углубиться в нее:

Нажмите здесь

Вернемся к основной теме. Теперь у нас есть пакеты с правильными зависимостями. Создайте папку с именем "test", в которой мы будем хранить несколько тестовых примеров API. Создайте один файл и назовите его, например: api.test.js.

const { expect } = require('chai');
description('first describe statement', () => {
  it('First test, must work sucessfully', ()=> {
    expect("David").to.equal("David");
  });
});

Вот и все, вот как выглядит пример теста, я добавил простой образец логики, который будет проверять ожидание «Дэвид» на равенство «Дэвид»

Теперь о запуске нашего теста. Вот где нам нужен мокко. Мы должны добавить определенную строку в package.json и изменить тестовую строку, мы должны получить:

“scripts”: {
 “test”: “node_modules/.bin/mocha”
},

Давайте запустим наш образец теста, для этого мы должны запустить эту команду из нашего терминала:

npm test

эта конкретная команда пройдет через нашу тестовую папку и запустит файлы с расширением .test и выдаст отчет о тестовом запуске в терминале следующим образом:

Теперь давайте создадим хотя бы один API, чтобы протестировать его с помощью Nock. Создайте файл sampleRequest.js в корневом пакете.

const axios = require('axios');
module.exports = {
 getSampleUser(user) {
   return axios
    .get(`https://api.github.com/users/${user}`)
    .then((result) => result.data)
    .catch((err) => console.err(err));
   }
};

Это функция API с axios, которая будет извлекать данные пользователя, которые мы передаем функции в качестве аргумента, теперь мы также должны отредактировать файл api.test.js:

const { expect } = require('chai');
const response = require('../mockResponse');
const { getSampleUser} = require('../sampleRequest');
const nock = require('nock');
describe('first describe statement', () => {
  beforeEach(() => {
   nock('https://api.github.com')
   .get('/users/davit')
   .reply(200, response);
  });
  it('It should be true', () => {
   return getSampleUser('davit')
    .then(response => {
      expect (typeof response).to.equal('object');
      expect (response.location).to.equal('Tbilisi');
      expect (response.id).to.equal(2556493);
    });
  });
});

о beforeEach и его логике

beforeEach(() => {
 nock(‘https://api.github.com')
 .get(‘/users/davit’)
 .reply(200, response);
});

beforeEach — этот метод будет выполняться перед началом каждого тестового примера, например, в моем случае я проверяю код состояния 200 в каждом ответе тестового примера.

it('It should be true', () => {
   return getSampleUser('davit')
    .then(response => {
      expect (typeof response).to.equal('object');
      expect (response.location).to.equal('Tbilisi');
      expect (response.id).to.equal(2556493);
    });
  });

В мокко это означает тестовый пример и его функции, содержащие логику тестового примера. Например, в нашем тестовом примере я проверяю, является ли ответ типом объекта, местоположением в ответе является «Тбилиси» и идентификатором 2556493.

Итак, это окончательный код тестового примера. У нас есть функция gotSampleUser, реализованная путем добавления Nock в API с аргументами.

В конце концов, мы создали площадку для тестирования реальных API. но забыл упомянуть, нам нужен еще один файл с содержимым API Response, чтобы мы могли тестировать и сопоставлять данные с ним. Создайте новый файл mockResponse.js.

module.exports = {
"login": "davit",
  "id": 2556493,
  "node_id": "MDQ6VXNlcjI1NTY0OTM=",
  "avatar_url": "https://avatars.githubusercontent.com/u/2556493?v=4",
  "gravatar_id": "",
  "url": "https://api.github.com/users/davit",
  "html_url": "https://github.com/davit",
  "followers_url": "https://api.github.com/users/davit/followers",
  "following_url": "https://api.github.com/users/davit/following{/other_user}",
  "gists_url": "https://api.github.com/users/davit/gists{/gist_id}",
  "starred_url": "https://api.github.com/users/davit/starred{/owner}{/repo}",
  "subscriptions_url": "https://api.github.com/users/davit/subscriptions",
  "organizations_url": "https://api.github.com/users/davit/orgs",
  "repos_url": "https://api.github.com/users/davit/repos",
  "events_url": "https://api.github.com/users/davit/events{/privacy}",
  "received_events_url": "https://api.github.com/users/davit/received_events",
  "type": "User",
  "site_admin": false,
  "name": "Davit",
  "company": "Web Intelligence",
  "blog": "",
  "location": "Tbilisi",
  "email": null,
  "hireable": null,
  "bio": null,
  "twitter_username": null,
  "public_repos": 3,
  "public_gists": 14,
  "followers": 9,
  "following": 13,
  "created_at": "2012-10-14T10:22:40Z",
  "updated_at": "2021-04-15T09:57:13Z"
};

Это пример ответа от githubs api, вы можете использовать его с: https://api.github.com/users/davit

Теперь о функциональности: Nock будет сопоставлять данные из файла создателя (выше) с фактическими данными из ответа API.

Наслаждайтесь, подписывайтесь и хлопайте!

Мир ✌️