вступление
Прошло много времени с Часть 1 , Извини за это.
В этой части мы продолжим наши фильмы Read API с TDD. Мы будем немного быстрее, потому что теперь мы знаем шаг, который нам нужно сделать, чтобы следовать подходу TDD.
Fail -> Pass -> Refactor
Быстрые исправления
В последней части мы используем, в тестировании env, Postgres БД. Ничего плохого с этим, это нормально, чтобы его использовать. Но я думаю, будет быстрее в долгосрочной перспективе, если мы используем SQLite.
Не волнуйтесь снова, Адонис сделал это легко для нас
Первый забег
npm i -D sqlite3
Это установит диск, который нам нужен для SQLite в качестве зависимостей Dev.
Теперь идите в свой файл .env.testing и поставьте эти линии
DB_CONNECTION=sqlite DB_HOST=127.0.0.1 DB_PORT=3306 DB_USER=root DB_PASSWORD= DB_DATABASE=movies_challenges_test
Не забудьте удалить другого, кто касается БД.
Теперь, если вы перезагрузите тест с Тест Адониса
Вы должны увидеть весь тестовый пропуск
Если вы сравните это, прежде чем вы сможете увидеть, мы получим немного быстрее. Это будет быстрее все больше и больше теста мы добавим. SQLite – это в памяти DB.
Получить/API/Проблемы
Здесь, поскольку название говорит, мы будем работать над запросом на получение, который даст нам все проблемы в нашем API. На сегодняшний день и с целью учебника мы не беспокоимся о пагинации и т. Д.
adonis make:test GetChallenges
И выберите функциональный тест
Перейти к новому файлу
test/functional/get-challenges.spec.js
Как в прошлом тестовом файле, нам нужно импортировать завод и получить черта
'use strict' const Factory = use('Factory') const { test, trait } = use('Test/Suite')('Get Challenges') trait('Test/ApiClient') trait('Auth/Client') test('make sure 2 + 2 is 4', async ({ assert, client }) => { assert.equal(2 + 2, 4) })
Время написать первый тест. Во-первых, что мы хотим достичь здесь? Для этой конечной точки мы хотим убедиться, что мы можем получить все проблемы, которые мы должны сохранить в базе данных. Это будет довольно просто здесь.
'use strict' const Factory = use('Factory') const { test, trait } = use('Test/Suite')('Get Challenges') trait('Test/ApiClient') trait('Auth/Client') test('can get all the challenges', async ({ assert, client }) => { const challenges = await Factory.model('App/Models/Challenge').createMany(3) const response = await client.get('/api/challenges').end() response.assertStatus(200) response.assertJSONSubset([ { title: challenges[0].title }, { title: challenges[1].title }, { title: challenges[2].title } ]) })
Здесь мы сначала создаем 3 вызовы, используя метод CreateMany на заводе. После проверки состояния ответа равный 200, а также ответ JSON имеет все 3 заголовки внутри массива возврата.
Если вы запустите тест, это то, что вы видите.
Смысл, мы еще не создали маршрут. Перейдите в файл маршрута и добавьте
Route.get('/api/challenges', 'ChallengeController.all')
Теперь, если вы добавите эту строку в свой тестовый файл
console.log('error', response.error)
После того, как обещание ответа разрешается вы увидите.
'RuntimeException: E_UNDEFINED_METHOD: Method all missing on App/Controllers/Http/ChallengeController\n> More details: https://err.sh/adonisjs/errors/E_UNDEFINED_METHOD'
Это нормально, мы используем способ в контроллере, который не существует.
Идите в свой ChallengeController и добавьте этот метод
async all({ response, request }) { const challenges = await Challenge.all() return response.ok(challenges) }
Теперь после проведения теста все должно быть зеленым
Это позвонит всему методу из вашей модели Challenge, и это вернет массив всей доступной задачи. Ответ.Ок вернет объект JSON со статусом 200 ОК
Получить/API/Challenges/: ID
Время работать над получением одной задачи по его мнению.
Довольно простая работа снова, просто нужно следовать этим шагам.
adonis make:test GetChallenge
Вы можете скопировать и вставить последний тест, который мы создаем, чтобы получить все вызовы, это будет выглядеть почти одинаково.
'use strict' const Factory = use('Factory') const { test, trait } = use('Test/Suite')('Get Challenge') trait('Test/ApiClient') trait('Auth/Client') test('can get a challenge by id', async ({ assert, client }) => { const challenges = await Factory.model('App/Models/Challenge').createMany(3) const challenge = challenges[0] const response = await client.get(`/api/challenges/${challenge.id}`).end() response.assertStatus(200) response.assertJSONSubset({ title: challenge.title, id: challenge.id }) })
Довольно простое, мы создаем 3 задачи, чтобы сделать его немного более реалистичным. Мы после этого создаем переменную проблему, которая будет первым в массиве. Затем мы добавляем идентификатор на URL. В конце концов, мы проверяем статус 200, а также JSON должен иметь как название, так и идентификатор, который соответствует этому задачу.
Выполните тот же шаг, который мы сделали ранее, поэтому перейдите на маршруты и добавьте маршрут для этого.
Route.get('/api/challenges/:id', 'ChallengeController.show')
После этого ваш тест скажет, что у нас нет метода в вашем контроллере. Время добавить это
async show({ response }) { return response.ok({}) }
Следующая ошибка важна, тот, кто проверяет, если объект Repeate соответствует тому, что мы предполагали. Это довольно нормально, это не удалось здесь, мы возвращаем пустой объект. Так время, чтобы сделать это работать.
async show({ response, params }) { const challenge = await Challenge.find(params.id) return response.ok(challenge) }
Для получения доступа к идентификатору параметров мы используем объект params и затем вызовите находку из модели вызова.
Если вы запустите все тест, теперь все будет зеленым.
Но нам нужен еще один тест на эту конечную точку. Что произойдет, если удостоверение личности не существует?
Если вы попробуете это, это не удастся. Довольно легкий тест для записи
test('status 404 if id do not exist', async ({ assert, client }) => { const response = await client.get('/api/challenges/999').end() response.assertStatus(404) })
Скачать ли ошибка 204, должна равняться 404? Умч странно, время исправить это.
async show({ response, params }) { const challenge = await Challenge.findOrFail(params.id) return response.ok(challenge) }
Да, только одна вещь изменится, FindorFail, как имя, говорит, вернет 404, если объект не найден, действительно приятно и легко
Исходный код: https://github.com/equimper/adonis-tdd-tutorial-demo/tree/part-2
Конец слово
Надеюсь, вам наслаждаться этим, не слишком много, но мы начинаем понимать поток и посмотреть, как TDD поможет нам идти быстрее от реализации API.
В следующей части мы добавим способ для пользователя, чтобы получить все его проблемы. А также способ обновления и удаления проблемы, если вы являетесь автором.
Счастливый кодирование