Ինչպես փորձարկել Mongoose մոդելները Mongo հիշողության սերվերի միջոցով


Սկսեք արագ և հեշտությամբ փորձարկել՝ պտտելով MongoDB օրինակը հիշողության մեջ: Այս փաթեթը ձեզ հնարավորություն է տալիս կարճ ժամանակում կարգավորել:

Mongoose մոդելների փորձարկումը կարող է դժվար լինել, քանի որ դուք պետք է գրեք թեստեր, որոնք չեն խանգարում ձեր իրական տվյալների բազային: MongoDB հիշողության սերվերի փաթեթն առաջարկում է պարզ լուծում: Այն թույլ է տալիս պահպանել ձեր թեստի տվյալները հավելվածի հիշողության մեջ:

Այս ձեռնարկում դուք կստեղծեք պարզ Mongoose մոդել և կգրեք թեստեր՝ օգտագործելով Jest-ը և MongoDB հիշողության սերվերը:

Ի՞նչ է MongoDB հիշողության սերվերը:

Վերջին բանը, որ դուք ցանկանում եք, կեղծ տվյալներ պահպանելն է ձեր իրական տվյալների բազայում, ինչը կարող է տեղի ունենալ, եթե փորձարկման ընթացքում միանաք դրանց: Փոխարենը, դուք կարող եք ընտրել օգտագործել առանձին տեղական MongoDB օրինակ՝ ձեր տվյալները պահելու համար: Թեև սա աշխատում է, անհնար է, եթե ձեր թեստերն աշխատեն ամպի վրա: Ավելին, յուրաքանչյուր թեստի ընթացքում իրական տվյալների բազայի միացումը և հարցումը կարող է թանկանալ:

MongoDB հիշողության սերվերը, այնուամենայնիվ, պտտվում է իսկական MongoDB սերվերը և թույլ է տալիս պահպանել թեստային տվյալները հիշողության մեջ: Սա ավելի արագ է դարձնում, քան տեղական MongoDB տվյալների բազայի օգտագործումը, քանի որ տվյալները գրված չեն ֆիզիկական սկավառակի վրա:

Մոնգուստի մոդելի ստեղծում

Mongoose մոդելները ապահովում են ինտերֆեյս MongoDB տվյալների բազայի հետ ինտերֆեյսի համար: Դրանք ստեղծելու համար դուք պետք է դրանք կազմեք Mongoose սխեմայից, որը սահմանում է ձեր MongoDB տվյալների մոդելը: Այս ձեռնարկը կօգտագործի սխեմա անելիքների փաստաթղթի համար: Այն կպարունակի վերնագիր և լրացված դաշտեր:

Գործարկեք հետևյալ հրամանը տերմինալում՝ նոր թղթապանակ ստեղծելու և այնտեղ նավարկելու համար:

mkdir mongoose-model-test
cd mongoose-model-test

Նախաձեռնեք npm-ը հետևյալ հրամանով.

npm init -y

-y դրոշը հրահանգում է npm-ին ստեղծել լռելյայն արժեքներով package.json ֆայլ:

Կատարեք այս հրամանը՝ mongoose փաթեթը տեղադրելու համար.

npm install mongoose

Ստեղծեք նոր ֆայլ, որը կոչվում է todo.model.js և սահմանեք todo սխեման.

const mongoose = require("mongoose")
const { Schema } = mongoose
const TodoSchema = new Schema({
    item: {
        type: String,
        required: true
    },
    compeleted: {
        type: Boolean,
        required: true
    }
})

Այս ֆայլի վերջում ստեղծեք և արտահանեք todo մոդելը.

module.exports = mongoose.model("Todo", TodoSchema)

Թեստերի պլանավորում

Թեստեր գրելիս նախապես ցանկանում եք պլանավորել, թե ինչ եք փորձարկելու: Սա ապահովում է, որ դուք փորձարկում եք ձեր մոդելի բոլոր ֆունկցիոնալությունը:

Մեր ստեղծած Mongoose մոդելից todo-ն պետք է պարունակի String տիպի տարր և Բուլյան տիպի լրացված դաշտ: Այս երկու դաշտերն էլ պարտադիր են: Սա նշանակում է, որ առնվազն մեր թեստը պետք է ապահովի.

  • Վավեր տարրերը հաջողությամբ պահպանվել են տվյալների բազայում:
  • Առանց պարտադիր դաշտերի տարրերը չեն պահպանվում:
  • Անվավեր տիպի դաշտերով տարրերը չեն պահվում:

Մենք կգրենք այս թեստերը մեկ թեստային բլոկում, քանի որ դրանք կապված են: Jest-ում դուք սահմանում եք այս թեստային բլոկը՝ օգտագործելով նկարագրել ֆունկցիան: Օրինակ:

describe('Todo Model Test', () => {
    // Your tests go here
}

Տվյալների բազայի կարգավորում

MongoDB հիշողության սերվեր ստեղծելու համար դուք կստեղծեք նոր Mongo հիշողության սերվերի օրինակ և միացեք Mongoose-ին: Դուք նաև կստեղծեք գործառույթներ, որոնք պատասխանատու կլինեն տվյալների բազայում բոլոր հավաքածուները հանելու և Mongo հիշողության սերվերի օրինակից անջատելու համար:

Գործարկեք հետևյալ հրամանը՝ mongodb-memory-server տեղադրելու համար:

npm install mongodb-memory-server

Ստեղծեք նոր ֆայլ, որը կոչվում է setuptestdb.js և ներմուծեք mongoose և mongodb-memory-server:

const mongoose = require("mongoose");
const { MongoMemoryServer } = require("mongodb-memory-server");

Հաջորդը, ստեղծեք connectDB() ֆունկցիա: Այս գործառույթը ստեղծում է նոր Mongo հիշողության սերվերի օրինակ և միանում է Mongoose-ին: Դուք այն կգործարկեք բոլոր թեստերից առաջ՝ թեստային տվյալների բազային միանալու համար:

let mongo = null;
 
const connectDB = async () => {
  mongo = await MongoMemoryServer.create();
  const uri = mongo.getUri();
 
  await mongoose.connect(uri, {
    useNewUrlParser: true,
    useUnifiedTopology: true,
  });
};

Ստեղծեք dropDB() ֆունկցիա՝ ավելացնելով հետևյալ կոդը. Այս գործառույթը թողնում է տվյալների բազան, փակում է Mongoose կապը և դադարեցնում Mongo հիշողության սերվերի օրինակը: Դուք կգործարկեք այս գործառույթը բոլոր թեստերն ավարտելուց հետո:

const dropDB = async () => {
  if (mongo) {
    await mongoose.connection.dropDatabase();
    await mongoose.connection.close();
    await mongo.stop();
  }
};

Վերջին գործառույթը, որը դուք կստեղծեք, կոչվում է dropCollections(): Այն թողնում է բոլոր ստեղծված Mongoose հավաքածուները: Դուք այն կգործարկեք յուրաքանչյուր թեստից հետո:

const dropCollections = async () => {
  if (mongo) {
    const collections = await mongoose.connection.db.collections();
    for (let collection of collections) {
      await collection.remove();
    }
  }
};

Վերջապես արտահանեք conenctDB(), dropDB() և dropCollections() ֆունկցիաները։

module.exports = { connectDB, dropDB, dropCollections}

Թեստեր գրելը

Ինչպես նշվեց, դուք կօգտագործեք Jest-ը թեստերը գրելու համար: Գործարկեք հետևյալ հրամանը՝ կատակները տեղադրելու համար։

npm install jest

package.json ֆայլում կարգավորեք կատակը: Փոխարինեք ձեր գոյություն ունեցող «սկրիպտների» բլոկը հետևյալով.

"scripts": {
    "test": "jest --runInBand --detectOpenHandles"
},
"jest": {
    "testEnvironment": "node"
},

Ստեղծեք նոր ֆայլ, որը կոչվում է todo.model.test.js և ներմուծեք mongoose գրադարանը, todo մոդելը և conenctDB(), dropDB() և dropCollections() ֆունկցիաները.

const mongoose = require("mongoose");
const { connectDB, dropDB, dropCollections } = require("./setupdb");
const Todo = require("./todo.model");

Բոլոր թեստերը սկսելուց առաջ պետք է գործարկել connectDB() ֆունկցիան: Jest-ի միջոցով կարող եք օգտագործել BeforeAll() մեթոդը:

Դուք նաև պետք է գործարկեք մաքրման գործառույթները: Յուրաքանչյուր թեստից հետո գործարկեք dropCollections() ֆունկցիան, իսկ dropDB() ֆունկցիան բոլոր թեստերից հետո։ Ձեզ հարկավոր չէ դա անել ձեռքով և կարող եք օգտագործել afterEach() և afterAll() մեթոդները Jest-ից:

Տվյալների բազան կարգավորելու և մաքրելու համար ավելացրեք հետևյալ կոդը todo.model.test.js ֆայլին:

beforeAll(async () => {
  await connectDB();
});
 
afterAll(async () => {
  await dropDB();
});
 
afterEach(async () => {
  await dropCollections();
});

Այժմ դուք պատրաստ եք ստեղծել թեստեր:

Առաջին թեստը կստուգի, թե արդյոք todo տարրը հաջողությամբ տեղադրվել է տվյալների բազայում: Այն կստուգի, թե արդյոք օբյեկտի Id-ն առկա է ստեղծած փաստաթղթում և արդյոք այնտեղ գտնվող տվյալները համընկնում են տվյալների բազայում ուղարկված տվյալների հետ:

Ստեղծեք նկարագրության բլոկ և ավելացրեք հետևյալ կոդը.

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);
  });
});

Սա ստեղծում է նոր փաստաթուղթ տվյալների բազայում, որը պարունակում է տվյալներ validTodo փոփոխականում: Այնուհետև վերադարձված օբյեկտը վավերացվում է ակնկալվող արժեքների համեմատ: Որպեսզի այս թեստն անցնի, վերադարձված արժեքը պետք է ունենա օբյեկտի ID: Բացի այդ, տարրի և լրացված դաշտերի արժեքները պետք է համապատասխանեն validTodo օբյեկտի արժեքներին:

Բացի սովորական օգտագործման դեպքի փորձարկումից, դուք նաև պետք է փորձարկեք անհաջող օգտագործման դեպքը: Մեր նախատեսած թեստերից դուք պետք է փորձարկեք մանգուստի մոդելը todo օբյեկտով, բացակայող պարտադիր դաշտով և սխալ տիպով:

Նույն նկարագրության բլոկին ավելացրեք երկրորդ թեստը հետևյալ կերպ.

  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 mongoose մոդելն ակնկալում է և՛ իրը, և՛ ավարտված դաշտերը: Այն պետք է սխալ առաջացնի, եթե փորձեք պահպանել աշխատանքը առանց այս դաշտերից որևէ մեկի: Այս թեստը օգտագործում է try…catch բլոկը՝ նետված սխալը բռնելու համար: Թեստն ակնկալում է, որ սխալները լինելու են մանգուստ վավերացման սխալ և բխում են բացակայող լրացված դաշտից:

Ստուգելու համար, թե արդյոք մոդելը սխալ է թույլ տալիս, եթե դուք օգտագործում եք սխալ տեսակի արժեքներ, ավելացրեք հետևյալ կոդը նկարագրության բլոկին:

  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();
    }
  });

Նկատի ունեցեք, որ լրացված դաշտի արժեքը բուլյանի փոխարեն տող է: Թեստն ակնկալում է, որ վավերացման սխալ կհայտնվի, քանի որ մոդելն ակնկալում է բուլյան արժեք:

MongoMemoryServer-ը և Jest-ը հիանալի թիմ են կազմում

Mongo-memory-server npm փաթեթը հեշտ լուծում է տալիս Mongoose մոդելների փորձարկման համար: Դուք կարող եք կեղծ տվյալները պահել հիշողության մեջ՝ չդիպչելով ձեր հավելվածի տվյալների բազային:

Դուք կարող եք օգտագործել MongoMemoryServer-ը Jest-ի հետ՝ Mongoose մոդելների համար թեստեր գրելու համար: Նկատի ունեցեք, որ այն չի ներառում բոլոր հնարավոր թեստերը, որոնք կարող եք գրել ձեր մոդելների համար: Այդ թեստերը կախված կլինեն ձեր սխեմայից: