2015-03-18 6 views
0

Я работаю с mongojs и письменно тестирует mocha пробег покрытия с istanbul. Моя проблема в том, что я хотел бы включить тестирование ошибок db.Интеграционное тестирование с mongojs для покрытия ошибок базы данных

var mongojs = require('mongojs'); 
var db = mongojs.connect(/* connection string */); 
var collection = db.collection('test'); 

... 
rpc.register('calendar.create', function(/*... */) { 
    collection.update({...}, {...}, function (err, data) { 
     if (err) { 
      // this code should be tested 
      return; 
     } 

     // all is good, this is usually covered 
    }); 
}); 

тест выглядит следующим образом

it("should gracefully fail", function (done) { 

    /* trigger db error by some means here */ 

    invoke("calendar.create", function (err, data) { 
     if (err) { 
      // check that the error is what we expect 
      return done(); 
     } 

     done(new Error('No expected error in db command.')); 
    }); 
}); 

Существует достаточно сложная настройка сценарий, который настраивает среду для тестирования интеграции. Нынешнее решение состоит в том, чтобы отключить базу данных с помощью db.close() и запустить тест, в результате чего получится ошибка. Проблема с этим решением возникает, когда все остальные тесты после этого требуют соединения с базой данных, поскольку я пытаюсь восстановить соединение без успеха.

Любые идеи о том, как это решить аккуратно? Предпочтительно без написания пользовательских ошибок, которые могут не быть подняты следующей версией mongojs. Или есть лучший способ структурирования тестов?

ответ

0

Что насчет насмешки библиотеки, которая имеет дело с монго?

Например, предположим, db.update в конечном счете функция, которая вызывается с помощью collection.update вы можете захотеть сделать что-то вроде

describe('error handling', function() { 

    beforeEach(function() { 
    sinon.stub(db, 'update').yields('error'); 
    }); 

    afterEach(function() { 
    // db.update will just error for the scope of this test 
    db.update.restore(); 
    }); 

    it('is handled correctly', function() { 
    // 1) call your function 

    // 2) expect that the error is logged, dealt with or 
    // whatever is appropriate for your domain here 
    }); 

}); 

Я использовал Sinon который

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

Имеет ли это смысл?

+0

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

+0

Я вижу, что @AndreasNiedermair отредактировал мой вопрос, чтобы удалить ссылку на mongojs, на более общий случай простого тестирования, который в этом случае может и не быть тем, чем я был. Думаю, моя проблема не такая обычная, как я ожидал. –

+0

Я думаю, что если вы пытаетесь протестировать обработку ошибок, самый простой способ - высмеять и вернуть ошибку, но это просто ИМХО ... Я не знаю вашего сценария. –