Gerçek veritabanınıza müdahale etmeyen testler yazmanız gerektiğinden, Mongoose modellerini test etmek zor olabilir. MongoDB bellek sunucusu paketi, basit bir çözüm sunar. Test verilerinizi uygulama belleğinde saklamanızı sağlar.
Bu öğreticide, basit bir Mongoose modeli oluşturacak ve Jest ve MongoDB bellek sunucusunu kullanarak testler yazacaksınız.
MongoDB Bellek Sunucusu Nedir?
İstediğiniz son şey, test sırasında bağlanırsanız gerçekleşebilecek sahte verileri gerçek veritabanınıza kaydetmektir. Bunun yerine, verilerinizi depolamak için ayrı bir yerel MongoDB örneği kullanmayı tercih edebilirsiniz. Bu çalışırken, testlerinizin bulutta çalıştırılması mümkün değildir. Ayrıca, her test sırasında gerçek bir veritabanına bağlanmak ve sorgulamak pahalıya mal olabilir.
MongoDB bellek sunucusuancak, gerçek bir MongoDB sunucusunu çalıştırır ve test verilerini bellekte saklamanıza izin verir. Bu, veriler fiziksel bir diske yazılmadığından, yerel bir MongoDB veritabanı kullanmaktan daha hızlı hale getirir.
Mongoose Modelini Oluşturma
Mongoose modelleri, MongoDB veritabanı ile arayüz oluşturmak için bir arayüz sağlar. Bunları oluşturmak için bir Mongoose şemasından derlemeniz gerekir. MongoDB veri modelinizi tanımlayan. Bu öğretici, yapılacaklar belgesi için bir şema kullanacaktır. Başlık ve tamamlanmış alanları içerecektir.
Yeni bir klasör oluşturmak ve ona gitmek için terminalde aşağıdaki komutu çalıştırın.
mkdir firavun faresi-model-testi
CD firavun faresi-model-testi
Aşağıdaki komutla npm'yi başlatın:
npm başlangıç -y
bu -y flag, npm'ye varsayılan değerlerle bir package.json dosyası oluşturmasını söyler.
yüklemek için bu komutu yürütün. firavun faresi paket:
npm Yüklemek firavun faresi
adlı yeni bir dosya oluşturun. todo.model.js ve yapılacaklar şemasını tanımlayın:
const firavun faresi = gerekmek("firavun faresi")
const { Şema } = firavun faresi
const TodoŞema = yeni Şema({
öğe: {
tip: Sicim,
gereklidir: doğru
},
tamamlandı: {
tip: Boole,
gereklidir: doğru
}
})
Bu dosyanın sonunda yapılacaklar modelini oluşturun ve dışa aktarın:
modül.ihracat = mongoose.model("Yapılacaklar", YapılacaklarŞema)
Testleri Planlamak
Test yazarken, neyi test edeceğinizi önceden planlamak istersiniz. Bu, modelinizin tüm işlevlerini test etmenizi sağlar.
Oluşturduğumuz Mongoose modelinden yapılacak iş, String türünde bir öğe ve Boolean türünde tamamlanmış bir alan içermelidir. Bu alanların her ikisi de zorunludur. Bu, testimizin en azından şunları sağlaması gerektiği anlamına gelir:
- Geçerli öğeler veritabanına başarıyla kaydedilir.
- Gerekli alanları olmayan öğeler kaydedilmez.
- Geçersiz türde alanları olan öğeler kaydedilmez.
Bu testleri ilişkili oldukları için tek bir test bloğuna yazacağız. Jest'te, bu test bloğunu aşağıdakileri kullanarak tanımlarsınız: betimlemek işlev. Örneğin:
betimlemek('Yapılacak Model Testi', () => {
// Testleriniz buraya gelir
}
Veritabanını Ayarlama
Bir MongoDB bellek sunucusu kurmak için yeni bir Mongo bellek sunucusu örneği oluşturacak ve Mongoose'a bağlanacaksınız. Ayrıca, veritabanındaki tüm koleksiyonları bırakmaktan ve Mongo bellek sunucusu örneğinden bağlantıyı kesmekten sorumlu olacak işlevler oluşturacaksınız.
Yüklemek için aşağıdaki komutu çalıştırın mongodb-bellek-sunucusu.
npm Yüklemek mongodb-hafıza-sunucu
adlı yeni bir dosya oluşturun. setuptestdb.js ve mongoose ve mongodb-memory-server'ı içe aktarın.
const firavun faresi = gerekmek("firavun faresi");
const { MongoMemorySunucusu } = gerekmek("mongodb-bellek-sunucusu");
Ardından, bir connectDB() işlevi oluşturun. Bu işlev, yeni bir Mongo bellek sunucusu örneği oluşturur ve Mongoose'a bağlanır. Test veritabanına bağlanmak için tüm testlerden önce çalıştıracaksınız.
İzin Vermek mongo = hükümsüz;
const connectDB = zaman uyumsuz () => {
mongo = beklemek MongoMemoryServer.create();
const uri = mongo.getUri();
beklemek mongoose.connect (uri, {
useNewUrlParser: doğru,
BirleşikTopolojiyi kullanın: doğru,
});
};
Aşağıdaki kodu ekleyerek bir dropDB() işlevi oluşturun. Bu işlev veritabanını bırakır, Mongoose bağlantısını kapatır ve Mongo bellek sunucusu örneğini durdurur. Tüm testler tamamlandıktan sonra bu işlevi çalıştıracaksınız.
const dropDB = zaman uyumsuz () => {
eğer (mongo) {
beklemekfiravun faresi.bağ.dropVeritabanı();
beklemekfiravun faresi.bağ.kapat();
beklemek mongo.stop();
}
};
Oluşturacağınız son işleve dropCollections() adı verilir. Oluşturulan tüm Mongoose koleksiyonlarını düşürür. Her testten sonra çalıştıracaksınız.
const dropKoleksiyonlar = zaman uyumsuz () => {
eğer (mongo) {
const koleksiyonlar = beklemek mongoose.connection.db.collections();
için (İzin Vermek Toplamak nın-nin koleksiyonlar) {
beklemek koleksiyon.kaldır();
}
}
};
Son olarak, conenctDB(), dropDB() ve dropCollections() işlevlerini dışa aktarın.
modül.ihracat = { connectDB, dropDB, dropCollections}
Testleri Yazma
Belirtildiği gibi, testleri yazmak için Jest'i kullanacaksınız. Jest'i yüklemek için aşağıdaki komutu çalıştırın.
npm Yüklemek alay
İçinde paket.json dosyası, jest'i yapılandırın. Mevcut "komut dosyaları" bloğunuzu aşağıdakilerle değiştirin:
"Kodlar": {
"Ölçek": "jest --runInBand --detectOpenHandles"
},
"alay": {
"test ortamı": "düğüm"
},
adlı yeni bir dosya oluşturun. todo.model.test.js ve mongoose kitaplığını, yapılacaklar modelini ve conenctDB(), dropDB() ve dropCollections() işlevlerini içe aktarın:
const firavun faresi = gerekmek("firavun faresi");
const { connectDB, dropDB, dropCollections } = gerekmek("./setupdb");
const Yapılacaklar = gerekmek("./todo.model");
Tüm testler çalıştırmadan önce connectDB() işlevini çalıştırmanız gerekir. Jest ile BeforeAll() yöntemini kullanabilirsiniz.
Ayrıca temizleme işlevlerini de çalıştırmanız gerekir. Her testten sonra, tüm testlerden sonra dropCollections() işlevini ve dropDB() işlevini çalıştırın. Bunu manuel olarak yapmanız gerekmez ve Jest'in afterEach() ve afterAll() yöntemlerini kullanabilirsiniz.
Veritabanını kurmak ve temizlemek için aşağıdaki kodu todo.model.test.js dosyasına ekleyin.
hepsinden önce(zaman uyumsuz () => {
beklemek connectDB();
});Nihayet(zaman uyumsuz () => {
beklemek dropDB();
});
Her birinden sonra(zaman uyumsuz () => {
beklemek dropCollections();
});
Artık testleri oluşturmaya hazırsınız.
İlk test, yapılacaklar öğesinin veritabanına başarıyla eklenip eklenmediğini kontrol edecektir. Oluşturulan nesnede nesne kimliğinin bulunup bulunmadığını ve buradaki verilerin veritabanına gönderdiğiniz ile eşleşip eşleşmediğini kontrol edecektir.
Bir açıklama bloğu oluşturun ve aşağıdaki kodu ekleyin.
betimlemek("Yapılacak Modeli", () => {
BT("bir yapılacaklar öğesini başarıyla oluşturmalı", zaman uyumsuz () => {
İzin Vermek geçerliTodo = {
öğe: "bulaşıkları yap",
Tamamlandı: yanlış,
};
const yeniYapılacaklar = beklemek Yapılacaklar (geçerli Yapılacaklar);
beklemek newTodo.save();
beklemek(yeniYapılacaklar._İD).Tanımlanacak();
beklemek(yeniYapılacaklar.öğe).olmak(geçerliYapılacak.öğe);
beklemek(yeniYapılacaklar.Tamamlandı).olmak(geçerliYapılacak.Tamamlandı);
});
});
Bu veritabanında yeni bir belge oluşturur validTodo değişkenindeki verileri içeren. Döndürülen nesne daha sonra beklenen değerlere göre doğrulanır. Bu testin geçmesi için döndürülen değerin bir nesne kimliğine sahip olması gerekir. Ayrıca, öğedeki ve tamamlanan alanlardaki değerler, validTodo nesnesindeki değerlerle eşleşmelidir.
Normal kullanım durumunu test etmenin yanı sıra, başarısız bir kullanım durumunu da test etmeniz gerekir. Planladığımız testlerden, mongoose modelini bir yapılacaklar nesnesi ile, gerekli alanı eksik ve bir tanesi yanlış tipte test etmeniz gerekiyor.
Aynı açıklama bloğuna aşağıdaki gibi ikinci bir test ekleyin:
BT("gerekli alanlar olmadan yapılacaklar öğesi için başarısız olmalı", zaman uyumsuz () => {
İzin Vermek geçersizTodo = {
öğe: "bulaşıkları yap",
};
denemek {
const yeniYapılacaklar = yeni Yapılacaklar (geçersiz Yapılacaklar);
beklemek newTodo.save();
} tutmak (hata) {
beklemek(hata).toBeInstanceOf(firavun faresi.Hata.Doğrulama Hatası);
beklemek(hata.hatalar.Tamamlandı).Tanımlanacak();
}
});
Todo firavun faresi modeli hem öğeyi hem de tamamlanmış alanları bekler. Bu alanlardan biri olmadan yapılacakları kaydetmeye çalışırsanız hata verecektir. Bu test, atılan hatayı yakalamak için try…catch bloğunu kullanır. Test, hataların bir firavun faresi doğrulama hatası olmasını ve eksik tamamlanmış alandan kaynaklanmasını bekler.
Yanlış türde değerler kullanırsanız modelin hata verip vermediğini test etmek için aşağıdaki kodu açıklama bloğuna ekleyin.
BT("yanlış türde alanlara sahip yapılacaklar öğesi için başarısız olmalı", zaman uyumsuz () => {
İzin Vermek geçersizTodo = {
öğe: "bulaşıkları yap",
Tamamlandı: "Yanlış"
};
denemek {
const yeniYapılacaklar = yeni Yapılacaklar (geçersiz Yapılacaklar);
beklemek newTodo.save();
} tutmak (hata) {
beklemek(hata).toBeInstanceOf(firavun faresi.Hata.Doğrulama Hatası);
beklemek(hata.hatalar.Tamamlandı).Tanımlanacak();
}
});
Tamamlanan alanın değerinin boole yerine bir dize olduğuna dikkat edin. Model bir boole değeri beklediğinden test, bir doğrulama hatasının atılmasını bekler.
MongoMemoryServer ve Jest Harika Bir Ekip Oluşturuyor
mongo-memory-server npm paketi, Mongoose modellerini test etmek için kolay bir çözüm sunar. Uygulamanızın veritabanına dokunmadan boş verileri bellekte saklayabilirsiniz.
Mongoose modelleri için testler yazmak için MongoMemoryServer'ı Jest ile kullanabilirsiniz. Modelleriniz için yazabileceğiniz tüm olası testleri kapsamadığını unutmayın. Bu testler şemanıza bağlı olacaktır.