Saya sedang dalam proses mempelajari Node.js dan telah bermain-main dengannya Express . Benar-benar menyukai kerangka kerjanya; namun, saya mengalami kesulitan untuk mengetahui cara menulis tes unit / integrasi untuk suatu rute.
Mampu menguji unit modul sederhana itu mudah dan telah dilakukan bersama Mocha ; namun, pengujian unit saya dengan Express gagal karena objek respons yang saya teruskan tidak mempertahankan nilainya.
Route-Function Under Test (routes / index.js):
exports.index = function(req, res){
res.render('index', { title: 'Express' })
};
Modul Uji Unit:
var should = require("should")
, routes = require("../routes");
var request = {};
var response = {
viewName: ""
, data : {}
, render: function(view, viewData) {
viewName = view;
data = viewData;
}
};
describe("Routing", function(){
describe("Default Route", function(){
it("should provide the a title and the index view name", function(){
routes.index(request, response);
response.viewName.should.equal("index");
});
});
});
Ketika saya menjalankan ini, gagal untuk "Kesalahan: kebocoran global terdeteksi: viewName, data".
Di mana kesalahan saya sehingga saya bisa mendapatkan ini bekerja?
Apakah ada cara yang lebih baik bagi saya untuk menguji kode saya pada level ini?
Perbarui 1. Potongan kode yang diperbaiki karena saya awalnya lupa "it ()".
Seperti yang direkomendasikan orang lain dalam komentar, sepertinya cara kanonik untuk menguji pengontrol Express sudah selesai supertest .
Tes contoh mungkin terlihat seperti ini:
Kelebihan: Anda dapat menguji seluruh tumpukan Anda sekaligus.
Kelemahan: rasanya dan bertindak seperti pengujian integrasi.
sumber
integration
, dan mungkin rute pengujian harus diserahkan kepada tes integrasi. Maksud saya, fungsionalitas rute yang cocok dengan callback yang ditentukan mungkin sudah diuji oleh express.js; logika internal apa pun untuk mendapatkan hasil akhir dari sebuah rute, idealnya harus dimodulasi di luarnya, dan modul tersebut harus diuji unit. Interaksi mereka, yaitu, rute, harus diuji integrasi. Apakah anda setujuSaya sampai pada kesimpulan bahwa satu-satunya cara untuk benar-benar menguji unit aplikasi ekspres adalah dengan mempertahankan banyak pemisahan antara penangan permintaan dan logika inti Anda.
Jadi, logika aplikasi Anda harus berada dalam modul terpisah yang dapat diuji
require
d dan unit, dan memiliki ketergantungan minimal pada kelas Permintaan dan Respons Ekspres seperti itu.Kemudian di penangan permintaan Anda perlu memanggil metode yang sesuai dari kelas logika inti Anda.
Saya akan memberikan contoh setelah saya selesai merestrukturisasi aplikasi saya saat ini!
Saya kira sesuatu seperti ini? (Jangan ragu untuk membagi intinya atau berkomentar, saya masih mengeksplorasi ini).
Edit
Berikut adalah contoh kecil, sebaris. Lihat intinya untuk contoh yang lebih detail.
sumber
Cara termudah untuk menguji HTTP dengan express adalah dengan mencuri http helper TJ
Saya pribadi menggunakan pembantunya
Jika Anda ingin menguji objek rute Anda secara khusus, teruskan tiruan yang benar
sumber
jika unit testing dengan express 4 note contoh ini dari gjohnson :
sumber
Saya juga bertanya-tanya tentang ini, tetapi secara khusus untuk pengujian unit dan bukan pengujian integrasi. Inilah yang saya lakukan sekarang,
Dimana routerObj itu adil
{router: expressRouter, path: '/api'}
. Saya kemudian memuat di subrouter denganvar loginRouterInfo = require('./login')(express.Router({mergeParams: true}));
dan kemudian aplikasi ekspres memanggil fungsi init yang mengambil router ekspres sebagai parameter. InitRouter kemudian memanggilrouter.use(loginRouterInfo.path, loginRouterInfo.router);
untuk memasang subrouter.Subrouter dapat diuji dengan:
sumber
Untuk mencapai pengujian unit alih-alih pengujian integrasi, saya mengejek objek respons dari penangan permintaan.
Kemudian, untuk mencapai pengujian integrasi, Anda dapat memalsukan endpointHandler dan memanggil titik akhir dengan supertest .
sumber
Dalam kasus saya, satu-satunya yang ingin saya uji adalah jika pawang kanan telah dipanggil. Saya ingin menggunakan supertest untuk memanfaatkan kesederhanaan membuat permintaan ke middleware perutean. Saya menggunakan Typecript a dan ini adalah solusi yang berhasil untuk saya
Rute
Tesnya
Saya memiliki beberapa masalah untuk membuat ejekan bekerja. tetapi menggunakan jest.doMock dan urutan spesifik yang Anda lihat di contoh membuatnya berfungsi.
sumber