Test etme, zaman alıcı olabilse de, herhangi bir uygulamanın geliştirme döngüsünde önemli bir adımdır. Kodu üretime göndermeden önce hataları ve sorunları erken yakalamanızı sağlar.

Bir Express Rest API'sini test etmek için Jest'i kullanabilirsiniz. Basit bir CRUD API'si oluşturduktan sonra, her bir uç nokta için nasıl test yazılacağını keşfedin.

Jest Nedir?

Aralarından seçim yapabileceğiniz birçok JavaScript test kitaplığı vardır, ancak Alay başlamak en kolayıdır. Facebook tarafından geliştirilen ve çoğunlukla React projelerini test etmek için kullanılan bir test kütüphanesidir. Ancak, Node ve diğer JavaScript tabanlı projeleri test etmek için de kullanabilirsiniz. Başka bir test aracı olan Jasmine'in üzerine geliştirilmiştir ve kendi iddia kitaplığı ile birlikte gelir.

Jest'te testler yazmak için bir onaylama kitaplığına ihtiyacınız olmayacak olsa da, HTTP istekleri yapmak için bir araç kullanmanız gerekecektir. Bu makale SuperTest'i kullanır.

Süper Test Nedir?

Süper Test HTTP çağrıları için bir Düğüm test kitaplığıdır. Süperajan test kitaplığını genişletir ve GET, POST, PUT ve DELETE gibi isteklerde bulunmanıza izin verir.

instagram viewer

SuperTest, HTTP istekleri yapmak için kullanabileceğiniz bir istek nesnesi sağlar.

const istek = gerekmek("en süper")
rica etmek("https://icanhazdadjoke.com")
.almak('/slack')
.son(işlev(hata, res) {
eğer (hata) atmak hata;
konsol.kayıt(res.gövde.ekler);
});

Burada API'nin temel URL'sini istek nesnesine iletirsiniz ve ardından HTTP yöntemini URL'nin geri kalanıyla zincirlersiniz. bu son() yöntemi API sunucusunu çağırır ve geri arama işlevi yanıtını işler.

API'den yanıt aldığınızda, doğrulamak için Jest'i kullanabilirsiniz.

Bir Ekspres API Oluşturun

Kendi API uç noktalarınızı test etmek için oluşturmanız gerekir. bir REST API'si ilk. Oluşturacağınız API oldukça basittir. Bir dizideki öğeleri ekler, alır, günceller ve siler.

node-jest adlı yeni bir dizin oluşturarak ve npm'yi başlatarak başlayın.

mkdir düğüm şakası
npm başlangıç ​​-y

Ardından, adlı yeni bir dosya oluşturun index.js ve Express sunucusunu oluştur.

const ifade = gerekmek("ifade etmek")
const uygulama = ekspres()
app.listen (3000, () => konsol.log("3000 numaralı bağlantı noktasında dinleme"))

GET /todos Bitiş Noktasını test edin

Oluşturacağınız ilk uç nokta, GET /todos uç noktasıdır. Dizideki tüm öğeleri döndürür. index.js'de aşağıdakini ekleyin.

const todo = [
];
// Tüm yapılacakları al
app.get("/todos", (gereklilik, öz) => {
dönüşres.durum(200).json({
veri: todos,
hata: hükümsüz,
});
});

Yanıtın 200 durum koduna ve data adlı bir dizide yapılacaklar öğesini ve bir hata mesajı içeren bir JSON nesnesine sahip olduğunu unutmayın. Jest kullanarak test edeceğiniz şey budur.

Şimdi Jest ve SuperTest'i yükleyin:

npm Yüklemek şaka süper

Ardından, içine bir test komut dosyası ekleyin paket.json aşağıdaki gibi:

{
"Kodlar": {
"Ölçek": "alay"
}
}

Kendi testlerinizi yazmaya başlamadan önce, Jest'te temel bir testin nasıl yazılacağını anlamalısınız.

Aşağıdaki işlevi göz önünde bulundurun:

işlevtoplam(bir, b) {
dönüş bir + b;
}
modül.ihracat = toplam;

Test dosyasında şunları yapmanız gerekir:

  • İşlevi içe aktarın.
  • Testin ne yapması gerektiğini açıklayın.
  • Fonksiyonu çağırın.
  • Beklenen yanıtı, işlevden gelen gerçek yanıtla onaylayın.
const { toplam } = gerekmek("./toplam")
betimlemek("İki öğenin toplamı", zaman uyumsuz() => {
Ölçek("4 döndürmesi gerekir", () => {
beklemek(toplam(2,2)).olmak(4)
})
})

bu betimlemek anahtar sözcüğü, test grubunu belirtir ve Ölçek ifadesi belirli testi belirtir. İşlevden döndürülen değer, iletilen değerle eşleşirse olmak, sınav geçer.

API uç noktalarını test ederken, bir işlevi çağırmayacaksınız, ancak SuperTest veya başka bir HTTP istemci kitaplığını kullanarak bir istek göndereceksiniz.

GET bitiş noktasına dönersek, adında yeni bir dosya oluşturun. api.test.js. Burası tüm uç nokta testlerini yazacağınız yerdir. Test dosyasını bir ile adlandırma .Ölçek infix, Jest'in onu bir test dosyası olarak tanımasını sağlar.

api.test.js'de, süper testi içe aktarın ve temel URL'yi şu şekilde ayarlayın:

const istek = gerekmek("en süper")
const baseURL = "http://yerel ana bilgisayar: 3000"

Ardından, açıklama bloğunda ilk testi oluşturun:

betimlemek("GET / yapılacaklar", () => {
const yeniTodo = {
İD: kripto.randomUUID(),
öğe: "Su iç",
Tamamlandı: yanlış,
}
hepsinden önce(zaman uyumsuz () => {
// yapılacak işi ayarla
bekleme isteği (baseURL).post("/todo".send (newTodo);
})
Nihayet(zaman uyumsuz () => {
beklemek request (baseURL).delete(`/yapılacak/${newTodo.id}`)
})
BT("200 döndürmeli", zaman uyumsuz () => {
const yanıt = beklemek request (baseURL).get("/todos");
beklemek(tepki.durum kodu).olmak(200);
beklemek(tepki.gövde.hata).olmak(hükümsüz);
});
BT("todos'a geri dönmeli", zaman uyumsuz () => {
const yanıt = beklemek request (baseURL).get("/todos");
bekle (response.body.data.length >= 1).olmak(doğru);
});
});

Testleri çalıştırmadan önce kurulum ve sökme işlevlerini tanımlamanız gerekecektir. Bu işlevler, yapılacaklar dizisini testten önce bir öğeyle doldurur ve her testten sonra yapay verileri siler.

Tüm testlerden önce çalışan kod, BeforeAll() işlevindedir. Tüm testlerden sonra çalışan kod afterAll() işlevindedir.

Bu örnekte, her biri için POST ve DELETE uç noktalarına basıyorsunuz. Gerçek bir uygulamada, muhtemelen test verilerini içeren sahte bir veritabanına bağlanırsınız.

Bu testte, önce GET /todos uç noktasına bir istekte bulundunuz ve geri gönderilen yanıtı beklenen sonuçlarla karşılaştırdınız. Bu test paketi, yanıtın bir HTTP durum kodu 200, veriler boş değil ve hata mesajı boş.

POST /todo Bitiş Noktasını test edin

index.js'de POST /todo bitiş noktasını oluşturun:

uygulama.post("/todo", (gereklilik, öz) => {
denemek {
const { id, item, tamamlandı } = req.body;
const yeniTodo = {
İD,
öğe,
Tamamlandı,
};
yapılacaklar.itmek(yeniYapılacaklar);
dönüşres.durum(201).json({
veri: todos,
hata: hükümsüz,
});
} tutmak (hata) {
dönüşres.durum(500).json({
veri: hükümsüz,
hata: hata,
});
}
});

Bu testte, send() yöntemini kullanarak istek gövdesindeki yapılacaklar ayrıntılarını göndermeniz gerekecektir.

request (baseURL).post("/todo".gönder (yeniYapılacak)

POST /todo isteği, bir 201 durum kodu ve sonunda eklenen yeni öğeyle birlikte yapılacaklar dizisini döndürmelidir. Test şöyle görünebilir:

betimlemek("POST / yapılacak", () => {
const yeniTodo = {
// yapmak
}
Nihayet(zaman uyumsuz () => {
beklemek request (baseURL).delete(`/yapılacak/${newTodo.id}`)
})
BT("todos dizisine bir öğe eklemeli", zaman uyumsuz () => {
const yanıt = beklemek request (baseURL).post("/todo").send(newTodo);
const lastItem = yanıt.body.data[response.body.data.uzunluk-1]
beklemek(tepki.durum kodu).olmak(201);
beklemek(son öğe.öğe).olmak(yeniYapılacaklar["öğe"]);
beklemek(son öğe.Tamamlandı).olmak(yeniYapılacaklar["Tamamlandı"]);
});
});

Burada, yapılacaklar verilerini send() yöntemine argüman olarak iletiyorsunuz. Yanıt 201 durum koduna sahip olmalı ve ayrıca bir veri nesnesindeki tüm yapılacaklar öğelerini içermelidir. Yapılacakların gerçekten oluşturulup oluşturulmadığını test etmek için, döndürülen yapılacaklar listesindeki son girişin istekte gönderdiğiniz girişle eşleşip eşleşmediğini kontrol edin.

PUT /todos/:id bitiş noktası, güncellenmiş öğeyi döndürmelidir:

app.put("/todos/:id", (gereklilik, öz) => {
denemek {
const kimlik = gerekli.params.id
const yapılacaklar = todos.find((yapılacak) => todo.id == kimlik);
if(!todo) {
atmakyeniHata("Yapılacak bulunamadı")
}
todo.tamamlandı = gerekli.body.tamamlandı;
dönüşres.durum(201).json({
veri: yapılacaklar,
hata: hükümsüz,
});
} tutmak (hata) {
dönüşres.durum(500).json({
veri: hükümsüz,
hata: hata,
});
}
});

Yanıtı aşağıdaki gibi test edin:

betimlemek("Yapılacaklardan birini güncelle", () => {
const yeniTodo = {
// yapmak
}
hepsinden önce(zaman uyumsuz () => {
bekleme isteği (baseURL).post("/todo".send (newTodo);
})
Nihayet(zaman uyumsuz () => {
beklemek request (baseURL).delete(`/yapılacak/${newTodo.id}`)
})
BT("varsa öğeyi güncellemeli", zaman uyumsuz () => {
const yanıt = beklemek request (baseURL).put(`/todos/${newTodo.id}`).göndermek({
Tamamlandı: doğru,
});
beklemek(tepki.durum kodu).olmak(201);
beklemek(tepki.gövde.veri.Tamamlandı).olmak(doğru);
});
});

Yanıt gövdesindeki tamamlanan değer doğru olmalıdır. URL'ye güncellemek istediğiniz öğenin kimliğini eklemeyi unutmayın.

DELETE /todos/:id Bitiş Noktasını test edin

index.js'de DELETE bitiş noktasını oluşturun. Silinen öğe olmadan yapılacaklar verilerini döndürmelidir.

uygulama.silme("/todos/:id", (gereklilik, öz) => {
denemek {
const kimlik = gerekli.params.id
const yapılacaklar = yapılacaklar[0]
if (yapılacak) {
yapılacaklar.splice(İD, 1)
}
dönüşres.durum(200).json({
veri: todos,
hata: hükümsüz,
});
} tutmak (hata) {
dönüşres.durum(500).json({
veri: hükümsüz,
hata: hata,
});
}
});

Uç noktayı test etmek için, silinen öğenin döndürülen verilerde hala var olup olmadığını kontrol edebilirsiniz:

betimlemek("Yapılacaklardan birini sil", () => {
const yeniTodo = {
// yapmak
}
hepsinden önce(zaman uyumsuz () => {
bekleme isteği (baseURL).post("/todo".send (newTodo);
})
BT("bir öğeyi silmeli", zaman uyumsuz () => {
const yanıt = beklemek request (baseURL).delete(`/todos/${newTodo.id}`);
const todos = yanıt.body.data
const var = todos.find (yapılacaklar => {
newTodo.id == todoId
})
beklemek (mevcut).toBe(Tanımsız)
});
});

DELETE uç noktasından döndürülen veriler silinen öğeyi içermemelidir. Döndürülen öğeler bir dizide olduğundan, API'nin öğeyi doğru şekilde silip silmediğini kontrol etmek için Array[id] öğesini kullanabilirsiniz. Sonuç yanlış olmalıdır.

REST API'leri Oluşturma

Bu makalede, Jest API kullanarak bir Express Rest API'sini nasıl test edeceğinizi öğrendiniz. GET, PUT, POST ve DELETE HTTP istekleri için testler yazdınız ve URL ve istekteki uç noktaya nasıl veri gönderileceğini gördünüz. Kendi Rest API'nizi test ederken bu bilgiyi uygulayabilmelisiniz.