2012-12-27 12 views
8

Pracuję z node.js od miesięcy, ale teraz rozpoczynam nowy projekt i chciałbym się dowiedzieć, jak zorganizować aplikację.Struktura testowania jednostkowego na węźle node.js z mangustą

Mój problem pojawia się, gdy mówimy o testowaniu jednostkowym. Będę używał nodeunit do pisania testów jednostkowych.

Używam również express do definiowania moich tras REST.

Zastanawiam się nad napisaniem kodu dostępu do baz danych w dwóch "osobnych" plikach (będą one oczywiście bardziej oczywiste, ale próbuję uprościć kod). Będzie kod trasy.

var mongoose = require('mongoose') 
, itemsService = require('./../../lib/services/items-service'); 

// GET '/items' 
exports.list = function(req, res) { 
    itemsService.findAll({ 
     start: req.query.start, 
     size: req.query.size, 
     cb: function(offers) { 
      res.json(offers); 
     } 
    }); 
    }; 

I, jak używam, usługa elementów używana tylko do dostępu do warstwy danych. Robię to, aby przetestować tylko warstwę dostępu do danych w testach jednostkowych. To będzie coś takiego:

var mongoose = require('mongoose') 
    , Item = require('./../mongoose-models').Item; 

exports.findAll = function(options) { 
    var query = Offer 
     .find({}); 
    if (options.start && options.size) { 
     query 
      .limit(size) 
      .skip(start) 
    } 
    query.exec(function(err, offers) { 
     if (!err) { 
       options.cb(offers); 
      } 
    }) 
}; 

W ten sposób mogę sprawdzić za pomocą testów jednostkowych, czy działa poprawnie i mogę używać tego kodu wszędzie tam, gdzie chcę. Jedyne, czego nie jestem pewien, czy zostało to zrobione poprawnie, to sposób, w jaki przekazuję funkcję zwrotną, aby użyć zwróconej wartości.

Co myślisz?

Dzięki!

Odpowiedz

2

Tak, całkiem łatwo! Można użyć modułu testującego jednostki, takiego jak mocha i własnego potwierdzenia węzła lub innego, takiego jak should.

Jako przykład przypadek testowy dla przykładu modelu

var ItemService = require('../../lib/services/items-service'); 
var should = require('should'); 
var mongoose = require('mongoose'); 

// We need a database connection 
mongoose.connect('mongodb://localhost/project-db-test'); 

// Now we write specs using the mocha BDD api 
describe('ItemService', function() { 

    describe('#findAll(options)', function() { 

    it('"args.size" returns the correct length', function(done) { // Async test, the lone argument is the complete callback 
     var _size = Math.round(Math.random() * 420)); 
     ItemService.findAll({ 
     size : _size, 
     cb : function(result) { 
      should.exist(result); 
      result.length.should.equal(_size); 
      // etc. 

      done(); // We call async test complete method 
     } 
     }, 
    }); 


    it('does something else...', function() { 

    }); 

    }); 

}); 

I tak dalej, ad nauseum.

Kiedy skończysz pisać swoje testy - zakładając, że masz $ npm install mocha 'd - wtedy po prostu uruchomisz $ ./node_modules/.bin/mocha lub $ mocha, jeśli użyłeś flagi -m npm.

Zależy od tego, jak odbytnicza/szczegółowa chcesz być naprawdę. Zawsze mi doradzono i ułatwiono: Napisz najpierw testy, aby uzyskać jasną perspektywę specyfikacji. Następnie napisać wdrożenie przeciwko testom, z dodatkowym wglądem freebie.

+1

będziesz chciał połączyć się z mongo z mongodb: // / binarygiant

+0

Zaktualizowano przykład. – rounce

Powiązane problemy