Тестирование приложения Mongoose Node.JS

Я пытаюсь написать модульные тесты для частей моего приложения Node. Я использую Mongoose для своего ORM.

Я искал кучу, чтобы провести тестирование с помощью Mongoose и Node, но не пришел ни с чем. Решения/фреймворки кажутся полными или не упоминают насмешек.

Есть ли способ, которым я могу издеваться над своей Mongoose DB, чтобы я мог возвращать статические данные в своих тестах? Я бы предпочел не создавать тестовую БД и заполнять ее данными для каждого unit test.

Кто-нибудь еще сталкивался с этим?

Ответы

Ответ 1

Я решил это, немного структурировав свой код. Я сохраняю все связанные с мангустом вещи в отдельных классах с API, такими как "сохранить", "найти", "удалить", и ни один другой класс не имеет прямого доступа к базе данных. Затем я просто издеваюсь над те, которые зависят от данных.

Я сделал что-то подобное с фактическими возвращаемыми объектами. Для каждой модели, которую я использую в mongoose, у меня есть соответствующий класс, который обертывает его и предоставляет методы доступа к полям. Они также легко насмехаются.

Ответ 2

Я тоже искал ответы и оказался здесь. Это то, что я сделал:

Я начал использовать mockery, чтобы издеваться над модулем, в котором были мои модели. Затем создайте мой собственный макетный модуль с каждой моделью, свисающей с него как имущество. Эти свойства завернули реальные модели (так что дочерние свойства существуют для тестируемого кода). И затем я переопределяю методы, которые я хочу манипулировать для теста, например save. Это имело то преимущество, что издевательство было в состоянии отменить насмешку.

но...

Мне не все равно, что нужно отменить насмешку над написанием свойств оболочки для каждой модели. Так что теперь я просто требую свой модуль и переопределяю функции, которые я хочу манипулировать. Я, вероятно, буду запускать тесты в отдельных процессах, если это станет проблемой.

В части оформления моих тестов:

// mock out database saves
var db = require("../../schema");
db.Model1.prototype.save = function(callback) { 
    console.log("in the mock");
    callback();
};
db.Model2.prototype.save = function(callback) {
    console.log("in the mock");
    callback("mock staged an error for testing purposes");
};

Ответ 3

Также стоит упомянуть:
mockgoose - БД памяти, который издевается над Mongoose для целей тестирования.
monckoose - похоже, но использует другой подход (реализует поддельный драйвер). Monckoose кажется неопубликованным как от марта 2015 года.