2013-11-11 4 views
0

Я пытаюсь написать набор тестовых блоков для моего простого уровня БД SimpleDbLayerс использованием nodeunit. Я нахожу это довольно сложным.Пробные тесты с использованием соединений/драйверов DB с nodeunit

Проблема:

1) Я хочу подключиться к БД один раз и использовать это соединение. Я не могу использовать setUp и tearDown, поскольку они запускаются до и после каждый тест. В качестве «решения» я использую переменную модуля для области (см. Код ниже)

2) В моем простом слое DB есть несколько драйверов DB. MongoMixin - только один из них - я разрабатываю MariaMixin и PostgresMixin. В идеале я бы запускал эти тесты по одному для каждого драйвера, чтобы убедиться, что они работают. Есть ли хороший и простой способ сделать это?

3) Я делаю ошибки, когда я делаю ошибку с кодом моего теста, и все, что я получаю, является жалобой на test.done, которая не обнаружена. Есть ли какие-то обман, которые мне нужно знать здесь?

4) Я делаю что-нибудь ужасно неправильно? (см. код)

var 
    dummy 

, declare = require('simpledeclare') 
, SimpleDbLayer = require('./SimpleDbLayer') 

, MongoMixin = require('./MongoMixin.js') 

, mw = require('mongowrapper') 
, async = require('async') 
; 

var db, layer; 


exports.createLayer = { 

    databaseConnect: function(test){ 
    mw.connect('mongodb://localhost/hotplate', {}, function(err, returnedDb){ 
     test.ifError(err); 
     db = returnedDb; 
     test.done(null); 
    }); 
    }, 


    makeLayer: function(test){ 

    var C = declare([ SimpleDbLayer, MongoMixin ]); 
    layer = new C('test', { name: true, surname: true, age: true }, db); 

    test.ok(layer); 
    test.done(); 
    }, 

    deleteAll: function(test){ 
    layer.delete({ }, { multi: true }, function(err, howmany){ 
     test.ifError(err); 
     test.done(); 
    }); 
    }, 

    insert: function(test){ 
    var people = [ 
     { name: 'Chiara', surname: 'Mobily',  age: 24 }, 
     { name: 'Tony',  surname: 'Mobily',  age: 37 }, 
     { name: 'Sara',  surname: 'Connor',  age: 14 }, 
     { name: 'Daniela', surname: 'Mobily',  age: 64 }, 
    ]; 

    returnedPeople = []; 

    var functions = []; 

    // Populate the database 
    people.forEach(function(person){ 

     functions.push(function(done){ 
     layer.insert(person, { returnRecord: true }, function(err, person){ 
      test.ifError(err); 
      returnedPeople.push(person); 
      done(null); 
     }) 
     }) 

    }) 

    async.series(functions, function(err, res){ 
     test.ifError(err); 
     test.done(); 
    }); 

    }, 

    databaseDisconnect: function(test){ 
    db.close(); 
    test.done(); 
    }, 

} 

ответ

0

Ответ на вопрос. Решение прост: для каждого драйвера это файл test.js:

var driver = require ('./ specificDriver'); var simpledblayerTests = require ("./lib/simpledblayer/test.js");

var tests = simpledblayerTests.get(

    function getDbInfo(done) { 
    mw.connect('mongodb://localhost/tests', {}, function(err, db){ 
     if(err){ 
     throw new Error("MongoDB connect: could not connect to database"); 
     } else { 
     done(null, db, driver); 
     } 
    }); 
    }, 

    function closeDb(db, done) { 
    db.close(done); 
    } 
); 


for(var test in tests) { 
    exports[ test ] = tests[ test ]; 
} 

В основном, функция get() экспортируемой фактическим «основной» модуль (подробнее об этом позже) принимает два параметра: две функций, которые открывают и закрывает соединение с базой данных.

Функция get() возвращает кучу функций, готовых к экспорту, - функции, которые составляют ваши единицы измерения.

Основной модуль будет иметь что-то вроде этого:

exports.get = function(getDbInfo, closeDb){ 

    var tests; 
    var g = {}; 

    var startup = function(test){ 
    var self = this; 

    test.doesNotThrow(function(){ 

     getDbInfo(function(err, db, driver){ 
     if(err){ 
      throw(new Error("Could not connect to db, aborting all tests")); 
      process.exit(); 
     } 

     // Set the important g.driver variables (db and driver) 
     g.db = db; 
     d.driver = driver 

     test.done(); 
     }); 
    }); 
    } 


    var finish = function(test){ 
    var self = this; 
    closeDb(g.db, function(err){ 
     if(err){ 
     throw(new Error("There was a problem disconnecting to the DB")); 
     } 
     test.done(); 
    }); 
    }; 

    tests = { 

    startup: startup, 

    // ... 
    // Your tests here. All functions will have access to g.db and g.driver 
    // ... 

    finish: finish 

    } 

    return tests; 
} 

Таким образом, каждый модуль будет работать те же тесты. Однако переменная driver и функции подключения/отключения к базе данных будут простыми.

в действии с реальным кодом:

Смежные вопросы