2016-02-05 43 views
18

Tôi mới đến Node và Express và tôi đang cố gắng để kiểm tra đơn vị tuyến đường/bộ điều khiển của tôi. Tôi đã tách các tuyến đường khỏi bộ điều khiển của mình. Tôi làm cách nào để thử nghiệm các tuyến đường của mình?Làm thế nào để đơn vị kiểm tra tốc độ tuyến đường Router

config/express.js

var app = express(); 
    // middleware, etc 
    var router = require('../app/router')(app); 

app/router/index.js

module.exports = function(app) { 
    app.use('/api/books', require('./routes/books')); 
    }; 

app/router/tuyến/books.js

var controller = require('../../api/controllers/books'); 
    var express = require('express'); 
    var router = express.Router(); 

    router.get('/', controller.index); 

    module.exports = router; 

app/api/controllers/books.js

// this is just an example controller 
exports.index = function(req, res) { 
    return res.status(200).json('ok'); 
}; 

app/kiểm tra/api/tuyến/books.test.js

var chai = require('chai'); 
    var should = chai.should(); 
    var sinon = require('sinon'); 

    describe('BookRoute', function() { 

    }); 
+1

Bản sao có thể có của [Làm thế nào để một đơn vị kiểm tra các tuyến với Express?] (Http://stackoverflow.com/questions/9517880/how-does-one-unit-test-routes-with-express) – gnerkus

+0

Không trùng lặp , câu hỏi được liên kết dành cho Express cũ hơn có API khác. – Kos

+0

Sử dụng [Link] này (http://www.designsuperbuild.com/blog/unit_testing_controllers_in_express/) hoặc [Link] này (http://www.chrisstead.com/archives/1128/unit-testing-express-routing/). –

Trả lời

1

tôi thấy this blog vô cùng sâu sắc khi thử nghiệm của riêng tôi máy chủ thiết bị đầu cuối.

Trong blog của ông phát biểu:

  • Làm thế nào để sử dụng thử nghiệm thư viện endpoint supertest.

  • Cách lập trình và chia nhỏ máy chủ tốc hành theo các tuyến cần thiết trước và sau mỗi lần kiểm tra điểm cuối. (ông cũng giải thích lý do tại sao bạn muốn làm điều này).

  • Làm thế nào để tránh một lỗi phổ biến, yêu cầu bộ nhớ đệm mô-đun của bạn được yêu cầu trong các bài kiểm tra đơn vị của bạn, dẫn đến hậu quả không mong muốn.

Hy vọng điều này sẽ hữu ích. Chúc may mắn và nếu bạn có bất kỳ câu hỏi nào khác, hãy cho tôi biết.

+3

Điểm blog có một số ví dụ hay về cách sử dụng supertest để kiểm tra các điểm cuối API. Tuy nhiên, tôi cảm thấy một số ý kiến ​​là cần thiết vì tôi không hoàn toàn đồng ý với tác giả. Bắt đầu và dừng máy chủ giữa mỗi thử nghiệm là một thiết kế tồi. Nếu đó là một API RESTful bạn đang thử nghiệm máy chủ nên được stateless anyway. Nếu đó là một ứng dụng có trạng thái, bạn có thể hủy bỏ phiên giữa mỗi bài kiểm tra để đạt được điều tương tự. Ngoài ra, có vẻ như tác giả không hiểu cách hoạt động của Stack JavaScript dẫn đến kết luận không chính xác. –

7

Code:

config/express.js

var app = express(); 
// middleware, etc 
var router = require('../app/router')(app); 

module.exports = app; 

app/kiểm tra/api/tuyến/books.test.js

var chai = require('chai'); 
var should = chai.should(); 
var sinon = require('sinon'); 
var request = require('supertest'); 
var app = require('config/express'); 

describe('BookRoute', function() { 
    request(app) 
     .get('/api/books') 
     .expect('Content-Type', /json/) 
     .expect('Content-Length', '4') 
     .expect(200, "ok") 
     .end(function(err, res){ 
      if (err) throw err; 
     }); 
}); 

Lưu ý:

Nếu yo Máy chủ ur yêu cầu trạng thái ban đầu ở đầu bộ kiểm tra (vì bạn đang thực hiện cuộc gọi làm thay đổi trạng thái máy chủ), bạn sẽ cần phải viết một hàm sẽ trả về ứng dụng được định cấu hình mới và bắt đầu mỗi nhóm kiểm tra . Có một thư viện NPM: https://github.com/bahmutov/really-need sẽ cho phép bạn yêu cầu một phiên bản mới được khởi tạo của máy chủ của bạn.

1

Điều này thật thú vị vì bạn đã tách bộ điều khiển ra khỏi bộ định tuyến của mình. Các bài viết khác StackOverflow được đề cập trong các ý kiến ​​là một cách tốt để kiểm tra bộ điều khiển của bạn, tôi nghĩ.Điều cần ghi nhớ với các bài kiểm tra đơn vị là bạn đang kiểm tra chính xác điều gì. Bạn không cần phải viết các bài kiểm tra để kiểm tra thư viện tốc hành vì có lẽ nó có các bài kiểm tra đơn vị riêng của nó. Vì vậy, bạn chỉ cần kiểm tra các cuộc gọi của bạn đến thư viện. Vì vậy, cho con đường sách, bạn chỉ cần kiểm tra một dòng mã này:

router.get('/', controller.index); 

Tôi nhìn xung quanh để xem nếu có được một cách rõ ràng để có được một danh sách các tuyến đường từ thư viện nhanh, nhưng tôi đã không' t thấy một. Bạn có thể chỉ cần nhìn vào chính thư viện và kiểm tra nội bộ của nó để xem bạn có đặt đúng tuyến đường hay không. Một lựa chọn khác mặc dù là để giả lập nó và chỉ cần kiểm tra xem bạn đang gọi nó một cách chính xác.

Điều này sẽ khá phức tạp vì bạn cần giả lập một số phần cơ bản của Javascript để kiểm tra một dòng mã này. Đây là cách tôi đã thực hiện:

describe('BookRoute', function() { 
    it("should route/to books controller index", function() { 
    var controller = require('../../../api/controllers/books'); 
    var orig_this = this; 
    var orig_load = require('module')._load; 
    var router = jasmine.createSpyObj('Router', ['get']); 
    var express = jasmine.createSpyObj('express', ['Router']); 
    express.Router.and.returnValues(router); 
    spyOn(require('module'), '_load').and.callFake(function() { 
     if (arguments[0] == 'express') { 
     return express; 
     } else { 
     return orig_load.apply(orig_this, arguments); 
     } 
    }); 
    require("../../../router/routes/books"); 
    expect(router.get).toHaveBeenCalledWith('/', controller.index); 
    }); 
}); 

Điều đang diễn ra ở đây là tôi đã sử dụng chức năng spyOn của Jasmine để điều khiển tất cả các cuộc gọi yêu cầu. Điều này là để khi chúng tôi yêu cầu bộ định tuyến sách và các cuộc gọi yêu cầu ('thể hiện'), chúng tôi có thể trả lại phần mềm SpyObj hiện tại của chúng tôi mà chúng tôi đã tạo bằng jasmine.createSpyObj. Một khi chúng tôi đã thay thế nhanh với đối tượng gián điệp của chúng tôi, sau đó chúng tôi có thể có nó trở lại Router SpyObj của chúng tôi mà sẽ cho phép chúng tôi gián điệp trên router.get. Sau đó, chúng ta có thể kiểm tra để đảm bảo nó được gọi với '/' và controller.index.

Điều này có thể có thể được thực hiện vào một số loại tiện ích nếu bạn muốn sử dụng điều này rất nhiều. Tôi thường tránh rất nhiều thứ này bằng cách sử dụng một phương pháp hướng đối tượng hơn và tôi đang đi xung quanh một số đối tượng ở khắp mọi nơi mà tôi có thể thử nghiệm hoặc bạn có thể sử dụng một số loại tiêm phụ thuộc như sử dụng Angular.

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