2016-01-09 25 views
11

I Supertest ve mocha kullanarak bu kodu vardır:mocha'da en üst düzey çalıştığında gerçek sunucu hatasını nasıl alırım?

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

    ... 
    }) 
}); 

sunucu kodu bir özel durum zaman (örneğin tanımlanmamış bir nesnenin özelliklerini erişim) ben gerçek yerine bu yığın izleme

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) 

olsun "undefined özelliklerine erişme" gibi bir şey söyleyen hata. Asıl hatayı nasıl alabilirim?

+0

Harika bir soru, gerçek işlevleri çağrıştıran düz eski birim testleri çökmeleri izlemek için daha iyi olabilir gibi görünüyor. Ya da belki de en üst düzey ve ünite testleri: –

cevap

0

Muhtemelen bununla başa çıkmanın birçok yolu vardır, ancak mocha ya da en üst düzey 500'ün ortaya çıkmasına neden olan gerçek hataya erişebileceğine inanmıyorum.

app oluşturmak için neler kullanıyorsunuz? Express ise, test sırasında herhangi bir 500-indükleme hatasına neden olan error-handling middleware eklenebilir.

0

Test kodunuz, işlemin yükselteceği uncaughtException olayını dinleyebilirsiniz. Ekspres uygulaması, tüm işlemlerini, test tertibatı ile aynı süreçte gerçekleştirdiği sürece, işlemdeki herhangi bir işlenmemiş istisna, proses uncaughtException olay işleyicisine gönderilecektir. Şimdi, işte biraz zor olabilir. Olay tabanlı olduğundan, işlenmemiş bir istisna olduğunda herhangi bir zamanda işten kovulabilir. Dolayısıyla, daha açık olmak istiyorsanız ve yalnızca test edilen sistemdeki istisnaları işlemek istiyorsanız, test kodu altında sistem çalıştırılmadan önce/sonra dinleyiciyi eklemeniz/kaldırmanız gerekecektir. İşte işlenmemiş bir istisna dinlemek için güncellenen örnek.

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

    ... 
    }) 
});