MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Как да тествам метод, който се свързва с mongo, без всъщност да се свързва с mongo?

Има няколко SO отговора, свързани с код за тестване на единици, който използва MongoDB като хранилище на данни:

  • Присмиваща база данни в node.js?
  • Мок/тест Mongodb Database Node.js
  • Вграден MongoDB при провеждане на интеграционни тестове
  • Подобно:Класове за тестване на модули, които имат онлайн функционалност

Ще направя опит за консолидиране на тези решения.

Преамбюл

На първо място, вие трябва искате MongoDB да работи, докато извършвате вашите тестове. Езикът за заявки на MongoDB е сложен, така че изпълнението на легитимни заявки срещу стабилен екземпляр на MongoDB е необходимо, за да се гарантира, че вашите заявки се изпълняват по план и че приложението ви отговаря правилно на резултатите. Имайки това предвид обаче, не трябва никога стартирайте вашите тестове срещу производствена система, но вместо това периферна система към вашата среда за интеграция. Това може да бъде на същата машина като вашия CI софтуер или просто относително близо до него (по отношение на процеса, не непременно мрежа или географски погледнато).

Този ENV може да бъде с малък отпечатък и да се изпълнява напълно в паметта (ресурс 1) (ресурс 2), но не изисква непременно същите характеристики на производителност като вашия производствен ENV. (Ако искате да тествате производителността, това така или иначе трябва да се обработва в среда, отделна от вашата CI.)

Настройка

  • Инсталирайте mongod услуга специално за CI. Ако репликите и/или разделянето представляват загриженост (напр. притеснение при писане, без използване на $isolated и т.н.), възможно е да се имитира клъстерирана среда чрез стартиране на множество mongod екземпляри (1 конфигурация, 2x2 данни за shard+repl) и mongos екземпляр на същата машина с някои init.d скриптове/ощипвания или нещо като docker.
  • Използвайте специфични за средата конфигурации във вашето приложение (или вградено чрез .json файлове, или на някакво място като /etc, /home/user/.your-app или подобно). Вашето приложение може да ги зареди въз основа на променлива на средата на възел като NODE_ENV=int . В рамките на тези конфигурации вашите низове за връзка с db ще се различават. Ако сте не като използвате специфични за env конфигурации, започнете да правите това като средство за абстрахиране на настройките по време на изпълнение на приложението (т.е. "local", "dev", "int", "pre", "prod" и т.н.). Мога да предоставя извадка при поискване.
  • Включете ориентирани към тестове приспособления към вашето приложение/пакет за тестване. Както беше споменато в един от свързаните въпроси, драйверът Node.js на MongoDB поддържа някои помощни библиотеки:mongodb-fixtures и node-database-cleaner . Приспособленията предоставят работещ и последователен набор от данни за тестване:мислете за тях като за начална програма.

Изграждане/тестове

  1. Почистете свързаната база данни, като използвате нещо като node-database-cleaner .
  2. Попълнете своите прибори в вече празната база данни с помощта на mongodb-fixtures .
  3. Извършете своята компилация и тест.
  4. Повторете.

От друга страна...

Ако все пак решите, че не Изпълняването на MongoDB е правилният подход (и няма да сте единственият), а след това абстрахирането на вашите обаждания за съхранение на данни от драйвера с ORM е най-добрият ви залог (за цялото приложение, а не само за тестване). Например нещо като model твърди, че е агностичен към базата данни, въпреки че никога не съм го използвал. Използвайки този подход, пак ще ви трябват осветителни тела и конфигурации на env , обаче няма да се изисква да инсталирате MongoDB. Предупреждението тук е, че сте на милостта на ORM, който изберете.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Opensource срещу MongoDB Enterprise

  2. Разбиране на издръжливостта и безопасността при запис в MongoDB

  3. MongoDB оцененDocumentCount()

  4. MongoDB - вземете документи с максимум атрибут за група в колекция

  5. Колко по-бърз е Redis от mongoDB?