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.

MongoDB Bellek Sunucusu Nedir?

Bu öğreticide, Jest ve MongoDB bellek sunucusunu kullanarak basit bir Mongoose modeli oluşturacak ve testler yazacaksınız.

MongoDB Bellek Sunucusu Nedir?

İsteyeceğiniz son şey, gerçek veritabanınıza test sırasında bağlanırsanız gerçekleşebilecek sahte verileri kaydetmektir. Bunun yerine, verilerinizi depolamak için ayrı bir yerel MongoDB bulut sunucusu kullanmayı tercih edebilirsiniz. Bu işe yarasa da, testlerinizin bulutta çalışması mümkün değildir. Ayrıca, her test sırasında gerçek bir veritabanına bağlanmak ve sorgulamak pahalı olabilir.

Ancak MongoDB bellek sunucusu , gerçek bir MongoDB sunucusunu döndürür ve test verilerini bellekte saklamanıza izin verir. Veriler fiziksel bir diske yazılmadığından bu, yerel bir MongoDB veritabanı kullanmaktan daha hızlı olmasını sağlar.

Firavun Faresi Modeli Oluşturma

Firavun faresi modelleri, MongoDB veritabanıyla arabirim oluşturmak için bir arabirim sağlar. Bunları oluşturmak için, MongoDB veri modelinizi tanımlayan bir Mongoose şemasından derlemeniz gerekir . Bu öğretici, yapılacaklar belgesi için bir şema kullanacaktır. Başlığı 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 mongoose-model-test

cd mongoose-model-test

Aşağıdaki komutla npm’yi başlatın:

npm init -y

-y bayrağı , npm’ye varsayılan değerlerle bir package.json dosyası oluşturması talimatını verir.

Mongoose paketini yüklemek için bu komutu yürütün :

npm install mongoose

todo.model.js adlı yeni bir dosya oluşturun ve yapılacaklar şemasını tanımlayın:

const mongoose = require(“mongoose”)

const { Schema } = mongoose

const TodoSchema = new Schema({

  item: {

    type: String,

    required: true

  },

  compeleted: {

    type: Boolean,

    required: true

  }

})

Bu dosyanın sonunda, yapılacaklar modelini oluşturun ve dışa aktarın:

module.exports = mongoose.model(“Todo”, TodoSchema)

Testleri Planlama

Testleri yazarken, neyi test edeceğinizi önceden planlamak istersiniz. Bu, modelinizin tüm işlevlerini test etmenizi sağlar.

Yarattığımız Mongoose modelinde 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 aşağıdakileri sağlaması gerektiği anlamına gelir:

Geçerli öğeler veritabanına başarıyla kaydedilir.

Zorunlu alanları olmayan öğeler kaydedilmez.

Geçersiz türde alanlara sahip öğeler kaydedilmez.

İlişkili oldukları için bu testleri tek bir test bloğunda yazacağız. Jest’te, bu test bloğunu tanımlama işlevini kullanarak tanımlarsınız. Örneğin:

describe(‘Todo Model Test’, () => {

  // Your tests go here

}

Veritabanı Kurulumu

Bir MongoDB bellek sunucusu kurmak için yeni bir Mongo bellek sunucusu örneği oluşturacak ve Mongoose’a bağlanacaksınız. Veritabanındaki tüm koleksiyonları bırakmaktan ve Mongo bellek sunucusu örneğinden bağlantıyı kesmekten sorumlu olacak işlevler de oluşturacaksınız.

mongodb-memory-server yüklemek için aşağıdaki komutu çalıştırın .

npm install mongodb-memory-server

setuptestdb.js adlı yeni bir dosya oluşturun ve mongoose ile mongodb-memory-server’ı içe aktarın.

const mongoose = require(“mongoose”);

const { MongoMemoryServer } = require(“mongodb-memory-server”);

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.

let mongo = null;

const connectDB = async () => {

 mongo = await MongoMemoryServer.create();

 const uri = mongo.getUri();

 await mongoose.connect(uri, {

  useNewUrlParser: true,

  useUnifiedTopology: true,

 });

};

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 = async () => {

 if (mongo) {

  await mongoose.connection.dropDatabase();

  await mongoose.connection.close();

  await 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 dropCollections = async () => {

 if (mongo) {

  const collections = await mongoose.connection.db.collections();

  for (let collection of collections) {

   await collection.remove();

  }

 }

};

Son olarak, conenctDB(), dropDB() ve dropCollections() işlevlerini dışa aktarın.

module.exports = { connectDB, dropDB, dropCollections}

Testleri Yazmak

Bahsedildiği gibi, testleri yazmak için Jest’i kullanacaksınız. jest yüklemek için aşağıdaki komutu çalıştırın.

npm install jest

package.json dosyasında jest’i yapılandırın. Mevcut “komut dosyaları” bloğunuzu aşağıdakilerle değiştirin:

“scripts”: {

  ”test”: “jest –runInBand –detectOpenHandles”

},

“jest”: {

  ”testEnvironment”: “node”

},

todo.model.test.js adlı yeni bir dosya oluşturun ve firavun faresi kitaplığını, yapılacaklar modelini ve conenctDB(), dropDB() ve dropCollections() işlevlerini içe aktarın:

const mongoose = require(“mongoose”);

const { connectDB, dropDB, dropCollections } = require(“./setupdb”);

const Todo = require(“./todo.model”);

Tüm testler çalıştırılmadan önce connectDB() işlevini çalıştırmanız gerekir. Jest ile, beforeAll() yöntemini kullanabilirsiniz.

Ayrıca temizleme işlevlerini ç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ıza gerek yoktur ve Jest’ten afterEach() ve afterAll() yöntemlerini kullanabilirsiniz.

Veritabanını kurmak ve temizlemek için todo.model.test.js dosyasına aşağıdaki kodu ekleyin.

beforeAll(async () => {

 await connectDB();

});

afterAll(async () => {

 await dropDB();

});

afterEach(async () => {

 await dropCollections();

});

Artık testleri oluşturmaya hazırsınız.

İlk test, yapılacak öğenin veritabanına başarıyla eklenip eklenmediğini kontrol edecektir. Oluşturulanda nesne kimliğinin mevcut olup olmadığını ve buradaki verilerin veritabanına gönderdiğiniz verilerle eşleşip eşleşmediğini kontrol edecektir.

Bir açıklama bloğu oluşturun ve aşağıdaki kodu ekleyin.

describe(“Todo Model”, () => {

 it(“should create a todo item successfully”, async () => {

  let validTodo = {

   item: “Do the dishes”,

   completed: false,

  };

  const newTodo = await Todo(validTodo);

  await newTodo.save();

  expect(newTodo._id).toBeDefined();

  expect(newTodo.item).toBe(validTodo.item);

  expect(newTodo.completed).toBe(validTodo.completed);

 });

});

Bu , validTodo değişkenindeki verileri içeren veritabanında yeni bir belge oluşturur . Döndürülen nesne daha sonra beklenen değerlere göre doğrulanır. Bu testin başarılı olması için döndürülen değerin bir nesne kimliği 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 firavun faresi modelini, gerekli alanı eksik ve türü yanlış olan bir yapılacaklar nesnesi ile test etmeniz gerekiyor.

Aynı açıklama bloğuna aşağıdaki gibi ikinci bir test ekleyin:

 it(“should fail for todo item without required fields”, async () => {

  let invalidTodo = {

   item: “Do the dishes”,

  };

  try {

   const newTodo = new Todo(invalidTodo);

   await newTodo.save();

  } catch (error) {

   expect(error).toBeInstanceOf(mongoose.Error.ValidationError);

   expect(error.errors.completed).toBeDefined();

  }

 });

Todo firavun faresi modeli, hem öğeyi hem de tamamlanmış alanları bekler. Bu alanlardan biri olmadan bir yapılacak işi kaydetmeye çalışırsanız bir hata atmalıdır. Bu test, atılan hatayı yakalamak için try…catch bloğunu kullanır. Test, hataların 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.

 it(“should fail for todo item with fields of wrong type”, async () => {

  let invalidTodo = {

   item: “Do the dishes”,

   completed: “False”

  };

  try {

   const newTodo = new Todo(invalidTodo);

   await newTodo.save();

  } catch (error) {

   expect(error).toBeInstanceOf(mongoose.Error.ValidationError);

   expect(error.errors.completed).toBeDefined();

  }

 });

Tamamlanan alanın değerinin bir boole yerine bir dize olduğunu unutmayın. Model bir boole değeri beklediğinden, test bir doğrulama hatasının atılmasını bekler.

MongoMemoryServer ve Jest Harika Bir Takım Oluşturuyor

Mongo-memory-server npm paketi, Mongoose modellerini test etmek için kolay bir çözüm sunar. Sahte verileri, uygulamanızın veritabanına dokunmadan bellekte saklayabilirsiniz.

Mongoose modelleri için testler yazmak için MongoMemoryServer’ı Jest ile birlikte kullanabilirsiniz. Modelleriniz için yazabileceğiniz olası tüm testleri kapsamadığını unutmayın. Bu testler şemanıza bağlı olacaktır.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir