Когда я писал 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.
Наслаждайтесь, подписывайтесь и хлопайте!
Мир ✌️