2015-05-31 21 views
7

Khi kiểm tra mã không đồng bộ bằng Mocha và một trong các xác nhận của tôi không thành công, tất cả Mocha làm là báo cáo lỗi hết thời gian chờ. đây có phải là cách cải thiện nó? Làm thế nào để biết những gì khẳng định thất bại và tại sao?Cách kiểm tra lỗi xác nhận trong Mocha khi kiểm tra mã async

mocha 

    Contact 
    #getContacts() 
     1) should return at least 1 contact 


    0 passing (3s) 
    1 failing 

    1) Contact #getContacts() should return at least 1 contact: 
    Error: timeout of 3000ms exceeded. Ensure the done() callback is being called in this test. 

Code:

var assert   = require("assert"); 
var contact  = require("../lib/contact.js"); 
var chai   = require('chai'); 
var should   = chai.should(); 

describe('Contact', function() { 
    describe('#getContacts()', function() { 
    it('should return at least 1 contact', function(done) { 
     contact.getContacts().then(function(contacts) { 
     assert.equal(4,2) 

     done() 
     }); 
    }) 
    }) 
}); 
+0

Cố gắng thiết lập một thời gian chờ cao hơn cho thử nghiệm cụ thể này với một 'this.setTimeout (10000)', chỉ để chắc chắn nó không phải chỉ là vấn đề bao lâu 'bạn phương thức GetContacts () 'đang thực hiện để kết thúc. –

Trả lời

6

Vấn đề là xác nhận không thành công, điều này sẽ loại trừ một ngoại lệ. Điều này làm cho lời hứa bị từ chối, nhưng không có ai để ý. Mã của bạn chỉ kiểm tra nếu lời hứa thành công. Nếu bạn trả lại lời hứa, thì mocha sẽ kiểm tra nó và thất bại trong bài kiểm tra nếu lời hứa bị từ chối.

Vì vậy, bạn muốn

it('should return at least 1 contact', function() { 
    return contact.getContacts().then(function(contacts) { 
     assert.equal(4,2); 
    }); 
}); 
+0

Làm việc như một sự quyến rũ. Cảm ơn! –

2

Bạn nên trả lại lời hứa như thế này:

it('should return at least 1 contact', function() { 
    return contact.getContacts().then(function(contacts) { 
    assert.equal(4,2); 
    }); 
}); 
1

Nó có vẻ như khi khẳng định ném một lỗi mà lỗi được nuốt và không bao giờ hiển thị và cũng là mã sau khi xác nhận ném được bỏ qua.

Hãy thử như thế này (bắt từ chối):

it('should return at least 1 contact', function(done) { 
    contact.getContacts().then(function(contacts) { 
    assert.equal(4,2) 

    done() 
    }).then(null, function (err) { 
    console.error(err); 

    done(err); 
    }); 
}) 

Hoặc thay vì sau đó (null, rejectFunc) sử dụng catch (rejectFunc) với libs như bluebird.

Ngoài ra câu trả lời của idbehold là rất tốt. Tôi đã không biết rằng mocha hỗ trợ hứa hẹn trực tiếp và tôi luôn luôn sử dụng param thực hiện biết nếu tôi có một thời gian chờ mà không có một dấu vết stack có một lỗi nuốt trong thử nghiệm này.

+0

Nó là để xử lý các tình huống như "dương tính giả". Phải không @IIiyan? –

+0

@muneermuhammed Vâng, chính xác. –