2012-12-27 22 views
8

Tôi đã phát triển với node.js trong nhiều tháng nhưng bây giờ tôi bắt đầu một dự án mới và tôi muốn biết cách cấu trúc ứng dụng.Cấu trúc để kiểm tra đơn vị trên node.js với mongoose

Sự cố của tôi xuất hiện khi nói về thử nghiệm đơn vị. Tôi sẽ sử dụng nodeunit để viết các bài kiểm tra đơn vị.

Ngoài ra tôi đang sử dụng Express để xác định các tuyến đường REST của mình.

Tôi đã suy nghĩ về cách viết mã truy cập cơ sở dữ liệu trong hai tệp "riêng biệt" (Chúng sẽ rõ ràng hơn, nhưng tôi chỉ đang cố đơn giản hóa mã). Sẽ có mã tuyến.

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); 
     } 
    }); 
    }; 

Và, khi tôi đang sử dụng ở đó, dịch vụ mục được sử dụng chỉ để truy cập lớp dữ liệu. Tôi đang làm điều này để kiểm tra lớp truy cập dữ liệu duy nhất trên thử nghiệm đơn vị. Nó sẽ có một cái gì đó như thế này:

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); 
      } 
    }) 
}; 

Bằng cách này tôi có thể kiểm tra với kiểm tra đơn vị nếu nó hoạt động một cách chính xác và tôi có thể sử dụng mã này ở khắp mọi nơi tôi muốn. Điều duy nhất tôi không chắc chắn nếu nó được thực hiện một cách chính xác là cách tôi vượt qua một chức năng gọi lại để sử dụng giá trị trả về.

Bạn nghĩ gì?

Cảm ơn!

Trả lời

2

Có, khá dễ dàng! Bạn có thể sử dụng mô-đun thử nghiệm đơn vị như mocha và xác nhận riêng của nút hoặc nút của một nút khác chẳng hạn như should.

Như một ví dụ về một trường hợp thử nghiệm cho mô hình ví dụ của bạn:

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() { 

    }); 

    }); 

}); 

Và như vậy, quảng cáo nauseum.

Sau đó, khi bạn hoàn thành việc viết bài kiểm tra - giả sử bạn đã $ npm install mocha 'd - thì bạn chỉ cần chạy $ ./node_modules/.bin/mocha hoặc $ mocha nếu bạn đã sử dụng cờ -g của npm.

Phụ thuộc vào cách trực tràng/chi tiết bạn muốn thực sự. Tôi đã luôn luôn được khuyên, và tìm thấy nó dễ dàng hơn để: Viết các bài kiểm tra đầu tiên, để có được một cái nhìn đặc điểm kỹ thuật rõ ràng. Sau đó, viết việc triển khai đối với các thử nghiệm, với bất kỳ thông tin chi tiết bổ sung nào về người dùng miễn phí.

+1

bạn sẽ muốn kết nối với mongo với mongodb: // / binarygiant

+0

Cập nhật ví dụ. – rounce

Các vấn đề liên quan