Подтвердить что ты не робот

Измерительная база данных в node.js?

Как бы я высмеял базу данных в моем приложении node.js, которое в этом случае использует mongodb в качестве бэкэнда для REST API в блоге?

Конечно, я мог бы установить базу данных в определенную базу данных testing, но я бы сохранил данные и не тестировал только мой код, но также и базу данных, поэтому на самом деле я не выполняю модульное тестирование, а тестирование интеграции. < ш >  Так что же делать? Создавать обертки базы данных как средний уровень между приложением и db и заменять DAL при тестировании?

// app.js  
var express = require('express');
    app = express(),
    mongo = require('mongoskin'),
    db = mongo.db('localhost:27017/test?auto_reconnect');

app.get('/posts/:slug', function(req, res){
    db.collection('posts').findOne({slug: req.params.slug}, function (err, post) {
        res.send(JSON.stringify(post), 200);
    });
});

app.listen(3000);

// test.js
r = require('requestah')(3000);
describe("Does some testing", function() {

  it("Fetches a blogpost by slug", function(done) {
    r.get("/posts/aslug", function(res) {
      expect(res.statusCode).to.equal(200);
      expect(JSON.parse(res.body)["title"]).to.not.equal(null);
      return done();
    });

  });
));
4b9b3361

Ответ 1

Я не думаю, что код, связанный с базой данных, может быть правильно протестирован без тестирования его с помощью программного обеспечения базы данных. Это потому, что код, который вы тестируете, - это не только javascript, но и строка запроса базы данных. Несмотря на то, что в вашем случае запросы выглядят просто, вы не можете полагаться на то, что это всегда навсегда.

Таким образом, любой уровень эмуляции базы данных обязательно будет реализовывать всю базу данных (возможно, за вычетом дискового хранилища). К тому времени вы завершаете интеграционное тестирование с эмулятором базы данных, даже если вы называете это модульным тестированием. Еще один недостаток заключается в том, что эмулятор базы данных может в конечном итоге иметь различный набор ошибок по сравнению с базой данных, и вам может понадобиться кодировать как эмулятор базы данных, так и базу данных (вроде ситуации с IE против Firefox против Chrome и т.д.).

Поэтому, на мой взгляд, единственный способ правильно протестировать ваш код - связать его с реальной базой данных.

Ответ 2

Существует общее эмпирическое правило, когда дело доходит до насмешки над

Не издевайтесь над тем, что у вас нет.

Если вы хотите издеваться над db hide, он будет выглядеть абстрактным слоем сервиса и высмеять этот уровень. Затем убедитесь, что вы интегрируете тестовый фактический уровень обслуживания.

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

Ответ 3

Я пока не согласен с выбранным ответом или другими ответами.

Разве это не было бы здорово, если бы вы могли поймать ошибки, порожденные хаотическими и многократными беспорядочными изменениями, внесенными в схемы БД и ваш код, прежде чем он достигнет QA? Готов поспорить, что большинство из вас будет кричать, да!

Вы, безусловно, можете и должны изолировать и протестировать ваши схемы БД. И вы не делаете этого на основе эмулятора или тяжелого изображения или отдыха у вас БД и машины. Вот что такое SQLite для всего лишь одного примера. Вы издеваетесь над ним на основе работы с облегченным экземпляром в памяти и со статическими данными, которые не меняются в этом экземпляре памяти, что означает, что вы действительно тестируете свою БД изолированно, и вы также можете доверять своим испытаниям. И, очевидно, это быстро, потому что это в памяти, скелет, и ломается в конце тестового прогона.

Итак, да, вы должны, и вы должны протестировать SCHEMA, которая экспортируется в очень легкий в памяти экземпляр любого механизма/времени работы БД, который вы используете, и что наряду с добавлением очень небольшого количества статических данных становится вашим изолированным издеваемым DB.

Вы экспортируете свои реальные схемы из вашей реальной базы данных периодически (автоматическим образом) и импортируете/обновляете их в своем ярком экземпляре БД памяти до каждого нажатия на QA, и вы будете знать мгновенно, если какие-либо последние изменения БД, сделанные вашей БД администраторы или другие разработчики, которые в последнее время изменили схему, нарушили любые тесты.

В то время как я приветствую усилия, чтобы попытаться изо всех сил ответить, я бы проголосовал за текущий ответ, если бы мог, но я новичок и еще не создал достаточную репутацию, чтобы еще раз дать мне возможность сделать это.

Что касается человека, который ответил "не издевайтесь над тем, что у вас нет". Я думаю, он хотел сказать: "Не проверяй ничего, что у тебя нет". Но вы делаете издевательства над тем, что у вас нет! Потому что те вещи, которые не тестируются, должны быть изолированы!

Я планирую поделиться с вами HOW и обновить этот пост в будущем, используя настоящий JS-код!

Это то, что многие команды, управляемые тестированием, делают все время. Вам просто нужно понять, как это сделать.

Ответ 4

Что?! Зачем что-то делать? Цель насмешки - пропустить сложность и unit test собственный код. Если вы хотите написать тесты e2e, используйте db.

Написание кода для установки/выключения тестовой БД для модульного тестирования - это технический долг и невероятно неудовлетворительный.

В npm есть макеты библиотек:

mongo - https://www.npmjs.com/package/mongomock

mongoose - https://www.npmjs.com/package/mockgoose

Если они не поддерживают функции, которые вам нужны, тогда да, возможно, вам придется использовать настоящую вещь.

Ответ 5

Мой предпочтительный подход к коду unit test DB на любом языке - это доступ к Mongo через абстракцию репозитория (здесь приведен пример http://iainjmitchell.com/blog/?p=884). Реализации будут различаться в зависимости от конкретной функциональности БД, но, удалив весь код Mongo из вашей собственной логики, вы в состоянии Unit Test. Просто замените реализацию Mongo Repository прошитой версией, которая тривиально проста. Например, просто сохраните объекты в простой коллекции словарей в памяти.

Вы получите преимущества модульного тестирования своего собственного кода таким образом без зависимостей БД, но вам все равно придется выполнять интеграционные тесты с основной БД, потому что вы, вероятно, никогда не сможете эмулировать особенности реальной базы данных как говорили другие. То, что я нашел, так же просто, как индексирование в безопасном режиме и без безопасного режима. В частности, если у вас есть уникальный индекс, реализация фиктивной памяти может похвастать тем, что во всех случаях, но Mongo не будет без безопасного режима.

Итак, пока вам нужно будет протестировать БД для некоторых операций, вы, безусловно, сможете unit test создать собственную логику с помощью исправленной реализации Репозитория.

Ответ 6

У меня была эта дилемма и я решил работать с тестовой БД и чистить ее каждый раз, когда начинается тест. (как отбросить все: fooobar.com/info/12411/...)

С NPM вы даже можете сделать тест script, который создает файл db и очищает его после.