Tłumaczenie: Français
Ten przepis pokazuje, jak przetestować punkty końcowe za pomocą AVA i Mongoose, zakładając, że używasz Express jako swojej struktury.
Ten przepis wykorzystuje następujące biblioteki:
mongodb-memory-server
(A MongoDB in-memory Server)- SuperTest (An endpoint testing library)
- Mongoose
Zainstaluj dwie pierwsze biblioteki, uruchamiając następujący kod:
$ npm install --save-dev mongodb-memory-server supertest
Powinieneś już mieć zainstalowaną Mongoose. Jeśli nie, uruchom następujący kod, aby go zainstalować:
(Uwaga: Potrzebujesz przynajmniej Mongoose v4.11.3)
$ npm install mongoose
Potrzebujesz pliku serwera i modelu Mongoose. Zobacz przykłady server.js
i models/User.js
.
Zauważ że server.js
nie uruchamia aplikacji. Zamiast tego musi to zrobić SuperTest, aby punkty końcowe aplikacji mogły zostać przetestowane. Jeśli używasz Express dla swojej aplikacji, upewnij się, że masz plik startowy, który się importuje app
i wywołuje app.listen()
.
Najpierw dołącz potrzebne biblioteki:
// Libraries required for testing
const test = require('ava');
const request = require('supertest');
const {MongoMemoryServer} = require('mongodb-memory-server');
const mongoose = require('mongoose');
// Your server and models
const app = require('../server');
const User = require('../models/User');
Następnie uruchom instancję in-memory MongoDB i połącz się z Mongoose:
// Start MongoDB instance
const mongod = new MongoMemoryServer()
// Create connection to Mongoose before tests are run
test.before(async () => {
const uri = await mongod.getConnectionString();
await mongoose.connect(uri, {useMongoClient: true});
});
Po uruchomieniu pierwszego testu MongoDB pobiera najnowsze pliki binarne MongoDB. Pobieranie jest ~70MB więc może to chwilę potrwać.
Będziesz chciał zapełnić bazę danych danymi zastępczymi. Oto przykład:
test.beforeEach(async () => {
const user = new User({
email: '[email protected]',
name: 'One'
});
await user.save();
});
Dane fikcyjne powinny być usuwane po każdym teście:
test.afterEach.always(() => User.remove());
Teraz możesz użyć SuperTestu, aby wysłać żądanie dotyczące punktu końcowego aplikacji. Użyj AVA dla swoich asercji:
// Note that the tests are run serially. See below as to why.
test.serial('litmus get user', async t => {
const {app} = t.context;
const res = await request(app)
.get('/litmus')
.send({email: '[email protected]'});
t.is(res.status, 200);
t.is(res.body.name, 'One');
});
test.serial('litmus create user', async t => {
const {app} = t.context;
const res = await request(app)
.post('/litmus')
.send({
email: '[email protected]',
name: 'New name'
});
t.is(res.status, 200);
t.is(res.body.name, 'New name');
// Verify that user is created in DB
const newUser = await User.findOne({email: '[email protected]'});
t.is(newUser.name, 'New name');
});
Na koniec odłącz i zatrzymaj MongoDB po zakończeniu wszystkich testów:
test.after.always(async () => {
mongoose.disconnect()
mongod.stop()
})
I skończyłeś!
Możesz wyodrębnić kod dla hook'ów test.before
, test.beforeEach
, test.afterEach.always
i test.after.always
do osobnego pliku. Spójrz na https://github.com/zellwk/ava-mdb-test po przykład.
Twoje testy prawdopodobnie zmienią bazę danych. Używając test()
oznacza, że działają równolegle, co może spowodować, że jeden test wpłynie na inny. Zamiast tego, jeśli używasz test.serial()
wtedy testy będą uruchamiane pojedynczo. Następnie możesz wyczyścić bazę danych między uruchomieniami testowymi, dzięki czemu testy są bardziej przewidywalne.
Możesz uruchomić testy jednocześnie, jeśli utworzysz osobne połączenia Mongoose dla każdego testu. Jest to jednak trudniejsze do skonfigurowania. Więcej informacji można znaleźć tutaj.