簡體   English   中英

使用帶有nodeunit的DB連接/驅動程序編寫單元測試

[英]Writing unit tests with DB connections/drivers with nodeunit

我正在嘗試使用nodeunit為我的簡單數據庫層SimpleDbLayer編寫一組測試單元。 我發現這很困難。

問題:

1)我想一次連接到數據庫,並使用該連接。 我不能真正使用setUp和tearDown,因為它們分別在每次測試之前和之后運行。 作為“解決方案”,我在范圍內使用模塊范圍的變量(請參見下面的代碼)

2)我的簡單數據庫層有幾個數據庫驅動程序。 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();
  },

} 

回答我自己。 解決方案很簡單:對於每個驅動程序,這是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變量和用於連接/斷開數據庫的功能將很簡單。

使用實際代碼查看它:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM