2016-01-09 14 views
11

tôi có mã này sử dụng supertest và mocha:Làm cách nào để tôi gặp lỗi máy chủ thực khi chạy supertest trong mocha?

import request from 'supertest'; 

//.... 

var newGame; 
describe('Creating game', function() { 
    beforeEach(function(done) { 
    request(app) 
     .post('/api/games') 
     .send({ 
     owner: 'Mr. X', 
     }) 
     .expect(201) 
     .expect('Content-Type', /json/) 
     .end((err, res) => { 
     if (err) { 
      return done(err); 
     } 
     newGame = res.body; 
     done(); 
     }); 
    });  

    describe('the created game', function() { 

    it('should name the specified owner', function() { 
     newGame.owner.should.equal('Mr. X'); 
    }); 

    ... 
    }) 
}); 

Khi mã máy chủ ném một số ngoại lệ (ví dụ như truy cập vào các thuộc tính của một đối tượng không xác định) tôi nhận được đống này dấu vết

Error: expected 201 "Created", got 500 "Internal Server Error" 
    at Test._assertStatus (D:\Codes\theApp\node_modules\supertest\lib\test.js:232:12) 
    at Test._assertFunction (D:\Codes\theApp\node_modules\supertest\lib\test.js:247:11) 
    at Test.assert (D:\Codes\theApp\node_modules\supertest\lib\test.js:148:18) 
    at Server.assert (D:\Codes\theApp\node_modules\supertest\lib\test.js:127:12) 
    at emitCloseNT (net.js:1521:8) 

thay vì thực tế lỗi có nội dung "truy cập thuộc tính không xác định". Làm thế nào tôi có thể nhận được lỗi thực tế?

+0

Câu hỏi hay, có vẻ như các thử nghiệm đơn vị cũ đơn giản gọi là chức năng thực tế có thể tốt hơn để theo dõi sự cố? Hoặc có thể có một sự kết hợp của supertests và thử nghiệm đơn vị: / –

Trả lời

0

Có thể có rất nhiều cách để giải quyết vấn đề này, nhưng tôi không tin rằng mocha hoặc supertest có quyền truy cập vào lỗi thực sự khiến 500 xảy ra.

Bạn đang sử dụng gì để tạo app? Nếu đó là Express, ví dụ, error-handling middleware có thể được thêm vào trong quá trình kiểm tra gây ra bất kỳ lỗi 500-inducing nào được ghi vào bàn điều khiển.

0

Bạn có thể yêu cầu mã thử nghiệm của mình lắng nghe sự kiện uncaughtException mà quy trình sẽ tăng. Miễn là ứng dụng Express thực hiện tất cả quá trình xử lý của nó trong cùng một quy trình như việc kiểm tra khai thác bất kỳ ngoại lệ không được xử lý nào trong tiến trình sẽ được gửi tới trình xử lý sự kiện uncaughtException. Bây giờ, đây là nơi mà nó có thể có một chút khó khăn. Kể từ đó, sự kiện của nó dựa trên nó có thể được bắn bất cứ lúc nào có một ngoại lệ unhandled. Vì vậy, nếu bạn muốn rõ ràng hơn và bạn chỉ muốn xử lý các ngoại lệ từ hệ thống đang thử nghiệm, bạn sẽ cần phải thêm/gỡ bỏ trình lắng nghe trước/sau khi hệ thống đang chạy thử nghiệm. Đây là ví dụ của bạn được cập nhật để nghe một ngoại lệ chưa được xử lý.

import request from 'supertest'; 

//.... 

var newGame; 
describe('Creating game', function() { 
    beforeEach(function(done) { 
    var unhandledException = undefined; 
    var unhandledExceptionCallback = function(err) { 
     unhandledException = err; 
    } 
    process.on('uncaughtException', unhandledExceptionCallback); 
    request(app) 
     .post('/api/games') 
     .send({ 
     owner: 'Mr. X', 
     }) 
     .expect(201) 
     .expect('Content-Type', /json/) 
     .end((err, res) => { 
     process.removeListener('uncaughtException', unhandledExceptionCallback); 
     if (unhandledException !== undefined){ 
      return done(unhandledException); 
     } else if (err) { 
      return done(err); 
     } 
     newGame = res.body; 
     done(); 
     }); 
    });  

    describe('the created game', function() { 

    it('should name the specified owner', function() { 
     newGame.owner.should.equal('Mr. X'); 
    }); 

    ... 
    }) 
}); 
Các vấn đề liên quan