Ini bisa menjadi tantangan untuk menguji model Mongoose karena Anda perlu menulis tes yang tidak mengganggu database Anda yang sebenarnya. Paket server memori MongoDB menawarkan solusi langsung. Ini memungkinkan Anda menyimpan data pengujian dalam memori aplikasi.

Dalam tutorial ini, Anda akan membuat model Mongoose sederhana dan menulis tes menggunakan Jest dan server memori MongoDB.

Apa itu Server Memori MongoDB?

Hal terakhir yang Anda inginkan adalah menyimpan data palsu di database asli Anda yang mungkin terjadi jika Anda menghubungkannya selama pengujian. Sebagai gantinya, Anda dapat memilih untuk menggunakan instans MongoDB lokal terpisah untuk menyimpan data Anda. Meskipun ini berfungsi, tidak mungkin jika pengujian Anda berjalan di cloud. Selain itu, menghubungkan dan menanyakan database nyata selama setiap pengujian bisa menjadi mahal.

Server memori MongoDB, namun, menjalankan server MongoDB nyata dan memungkinkan Anda untuk menyimpan data uji dalam memori. Ini membuatnya lebih cepat daripada menggunakan database MongoDB lokal karena data tidak ditulis pada disk fisik.

instagram viewer

Membuat Model Luwak

Model luwak menyediakan antarmuka untuk berinteraksi dengan database MongoDB. Untuk membuatnya, Anda perlu mengompilasinya dari skema Mongoose, yang mendefinisikan model data MongoDB Anda. Tutorial ini akan menggunakan skema untuk dokumen yang harus dilakukan. Ini akan berisi judul dan bidang yang telah diisi.

Jalankan perintah berikut di terminal untuk membuat folder baru dan arahkan ke sana.

mkdir luwak-model-test
CD luwak-model-test

Inisialisasi npm dengan perintah berikut:

npm init -y

Itu -y flag menginstruksikan npm untuk menghasilkan file package.json dengan nilai default.

Jalankan perintah ini untuk menginstal luwak kemasan:

npm Install luwak

Buat file baru bernama todo.model.js dan tentukan skema todo:

konstan luwak = memerlukan("luwak")
konstan { Skema } = luwak
konstan Skema Todo = baru Skema({
barang: {
Tipe: Rangkaian,
yg dibutuhkan: BENAR
},
selesai: {
Tipe: Boolean,
yg dibutuhkan: BENAR
}
})

Di akhir file ini, buat dan ekspor model todo:

modul.ekspor = luwak.model("Todo", TodoSchema)

Merencanakan Tes

Saat menulis tes, Anda ingin merencanakan apa yang akan Anda uji sebelumnya. Ini memastikan Anda menguji semua fungsionalitas model Anda.

Dari model Mongoose yang kita buat, todo harus berisi item bertipe String dan bidang tipe Boolean yang lengkap. Kedua bidang ini wajib diisi. Ini berarti bahwa, setidaknya, pengujian kami harus memastikan:

  • Item yang valid berhasil disimpan dalam database.
  • Item tanpa bidang wajib tidak disimpan.
  • Item dengan bidang jenis yang tidak valid tidak disimpan.

Kami akan menulis tes ini dalam satu blok tes karena mereka terkait. Di Jest, Anda mendefinisikan blok tes ini menggunakan menggambarkan fungsi. Sebagai contoh:

menggambarkan('Tes Model Todo', () => {
// Tes Anda ada di sini
}

Menyiapkan Basis Data

Untuk menyiapkan server memori MongoDB, Anda akan membuat instance server memori Mongo baru dan terhubung ke Mongoose. Anda juga akan membuat fungsi yang akan bertanggung jawab untuk menjatuhkan semua koleksi dalam database dan memutuskan sambungan dari instance server memori Mongo.

Jalankan perintah berikut untuk menginstal mongodb-memori-server.

npm Install mongodb-Penyimpanan-server

Buat file baru bernama setuptestdb.js dan impor luwak dan mongodb-memory-server.

konstan luwak = memerlukan("luwak");
konstan { MongoMemoryServer } = memerlukan("mongodb-memori-server");

Selanjutnya, buat fungsi connectDB(). Fungsi ini membuat instance server memori Mongo baru dan terhubung ke Mongoose. Anda akan menjalankannya sebelum semua tes terhubung ke database tes.

membiarkan mongo = batal;

konstan connectDB = tidak sinkron () => {
mongo = menunggu MongoMemoryServer.create();
konstan uri = mongo.getUri();

menunggu luwak.koneksi (uri, {
gunakanNewUrlParser: BENAR,
gunakanUnifiedTopology: BENAR,
});
};

Buat fungsi dropDB() dengan menambahkan kode berikut. Fungsi ini menjatuhkan database, menutup koneksi Mongoose, dan menghentikan instance server memori Mongo. Anda akan menjalankan fungsi ini setelah semua tes selesai dijalankan.

konstan dropDB = tidak sinkron () => {
jika (mongo) {
menungguluwak.koneksi.dropDatabase();
menungguluwak.koneksi.menutup();
menunggu mongo.stop();
}
};

Fungsi terakhir yang akan Anda buat disebut dropCollections(). Itu menjatuhkan semua koleksi Mongoose yang dibuat. Anda akan menjalankannya setelah setiap tes.

konstan dropCollection = tidak sinkron () => {
jika (mongo) {
konstan koleksi = menunggu luwak.koneksi.db.koleksi();
untuk (membiarkan koleksi dari koleksi) {
menunggu koleksi.hapus();
}
}
};

Terakhir, ekspor fungsi conenctDB(), dropDB(), dan dropCollections().

modul.ekspor = { connectDB, dropDB, dropCollections}

Menulis Tes

Seperti yang disebutkan, Anda akan menggunakan Jest untuk menulis tes. Jalankan perintah berikut untuk menginstal lelucon.

npm Install bersenda gurau

Dalam package.json file, konfigurasikan lelucon. Ganti blok "skrip" yang ada dengan yang berikut:

"skrip": {
"uji": "bercanda --runInBand --detectOpenHandles"
},
"bersenda gurau": {
"lingkungan pengujian": "simpul"
},

Buat file baru bernama todo.model.test.js dan impor pustaka luwak, model todo, dan fungsi conenctDB(), dropDB(), dan dropCollections():

konstan luwak = memerlukan("luwak");
konstan { connectDB, dropDB, dropCollections } = memerlukan("./setupdb");
konstan Todo = memerlukan("./todo.model");

Anda perlu menjalankan fungsi connectDB() sebelum semua pengujian dijalankan. Dengan Jest, Anda dapat menggunakan metode beforeAll().

Anda juga perlu menjalankan fungsi pembersihan. Setelah setiap pengujian, jalankan fungsi dropCollections() dan fungsi dropDB() setelah semua pengujian. Anda tidak perlu melakukan ini secara manual dan dapat menggunakan metode afterEach() dan afterAll() dari Jest.

Tambahkan kode berikut ke file todo.model.test.js untuk menyiapkan dan membersihkan database.

sebelum semua(tidak sinkron () => {
menunggu connectDB();
});

Lagipula(tidak sinkron () => {
menunggu dropDB();
});

setelahSetiap(tidak sinkron () => {
menunggu dropKoleksi();
});

Anda sekarang siap untuk membuat tes.

Tes pertama akan memeriksa apakah item todo berhasil dimasukkan ke dalam database. Ini akan memeriksa apakah Id objek ada dalam pembuatan dan apakah data di dalamnya cocok dengan yang Anda kirim ke database.

Buat blok deskripsi dan tambahkan kode berikut.

menggambarkan("Model Todo", () => {
dia("harus berhasil membuat item todo", asinkron () => {
membiarkan validTodo = {
barang: "Cuci piring",
lengkap: Salah,
};
konstan baruTodo = menunggu Todo (validTodo);
menunggu baruTodo.save();
mengharapkan(baruTodo._Indo).toBeDefined();
mengharapkan(baruTodo.barang).menjadi(validTodo.barang);
mengharapkan(baruTodo.lengkap).menjadi(validTodo.lengkap);
});
});

Ini membuat dokumen baru di database berisi data dalam variabel validTodo. Objek yang dikembalikan kemudian divalidasi terhadap nilai yang diharapkan. Agar tes ini lulus, nilai yang dikembalikan harus memiliki ID objek. Juga, nilai dalam item dan bidang yang diselesaikan harus cocok dengan yang ada di objek validTodo.

Selain menguji kasus penggunaan normal, Anda juga perlu menguji kasus penggunaan yang gagal. Dari pengujian yang kami rencanakan, Anda perlu menguji model luwak dengan objek todo, dengan bidang wajib yang hilang dan satu dengan jenis yang salah.

Tambahkan tes kedua ke blok deskripsi yang sama, sebagai berikut:

 dia("harus gagal untuk item yang harus dilakukan tanpa bidang yang wajib diisi", asinkron () => {
membiarkan tidak validTodo = {
barang: "Cuci piring",
};
mencoba {
konstan baruTodo = baru Todo (tidak validTodo);
menunggu baruTodo.save();
} menangkap (kesalahan) {
mengharapkan(kesalahan).toBeInstanceOf(luwak.Kesalahan.ValidasiError);
mengharapkan(kesalahan.error.lengkap).toBeDefined();
}
});

Model luwak Todo mengharapkan item dan bidang yang diselesaikan. Seharusnya menimbulkan kesalahan jika Anda mencoba menyimpan todo tanpa salah satu bidang ini. Tes ini menggunakan blok try…catch untuk menangkap kesalahan yang dilemparkan. Pengujian mengharapkan kesalahan menjadi kesalahan validasi luwak dan berasal dari bidang lengkap yang hilang.

Untuk menguji apakah model melontarkan kesalahan jika Anda menggunakan nilai dengan tipe yang salah, tambahkan kode berikut ke blok deskripsi.

 dia("harus gagal untuk item todo dengan bidang jenis yang salah", asinkron () => {
membiarkan tidak validTodo = {
barang: "Cuci piring",
lengkap: "PALSU"
};
mencoba {
konstan baruTodo = baru Todo (tidak validTodo);
menunggu baruTodo.save();
} menangkap (kesalahan) {
mengharapkan(kesalahan).toBeInstanceOf(luwak.Kesalahan.ValidasiError);
mengharapkan(kesalahan.error.lengkap).toBeDefined();
}
});

Perhatikan nilai bidang yang diselesaikan adalah string, bukan boolean. Tes mengharapkan kesalahan validasi akan dilemparkan karena model mengharapkan nilai boolean.

MongoMemoryServer dan Jest Membuat Tim yang Hebat

Paket npm mongo-memory-server menyediakan solusi mudah untuk menguji model Mongoose. Anda dapat menyimpan data dummy dalam memori tanpa menyentuh database aplikasi Anda.

Anda dapat menggunakan MongoMemoryServer dengan Jest untuk menulis tes untuk model Mongoose. Perhatikan bahwa ini tidak mencakup semua kemungkinan pengujian yang dapat Anda tulis untuk model Anda. Tes tersebut akan tergantung pada skema Anda.