2009-06-02 33 views
14

Tôi đang xem xét QUnit để kiểm tra đơn vị JavaScript. Tôi đang ở trong một tình huống kỳ lạ mà tôi đang kiểm tra so với giá trị được trả về từ cuộc gọi Ajax.QUnit với Ajax, QUnit vượt qua các bài kiểm tra không thành công

Đối với bài kiểm tra sau đây, tôi cố ý cố gắng để thất bại.

// test to check if the persons are returned! 
test("getPersons", function() { 
    getPersons(function(response) { 
    // persons = $.evalJSON(response.d); 
    equals("boo", "Foo", "The name is valid"); 
    }); 
}); 

Nhưng nó kết thúc luôn luôn đi qua. Đây là phương thức getPersons thực hiện cuộc gọi Ajax.

function getPersons(callback) { 
    var persons = null; 

    $.ajax({ 
    type: "POST", 
    dataType: "json", 
    data: {}, 
    contentType: "application/json", 
    url: "AjaxService.asmx/GetPersons", 
    success: function(response) { 
     callback(response); 
    } 
    }); 
} 
+0

Tôi khuyên bạn cũng nên điền số "mong đợi" (đối số thứ hai vào 'QUnit.test') để dễ nắm bắt hơn khi không phải mọi thứ được gọi đúng lúc. Nếu không, nó có thể chuyển nếu 'bắt đầu' được gọi quá sớm trước khi tất cả các xác nhận đã được gửi. – Krinkle

Trả lời

25

Bắt đầu và dừng sử dụng thư viện QUnit dường như đang hoạt động!

// test to check if the persons are returned! 
test("getPersons", function() { 
    stop(); 
    getPersons(function(response) { 
    persons = $.evalJSON(response.d); 
    equals(persons[0].FirstName, "Mohammad"); 
    start(); 
    }); 
}); 
+1

Như @Goyuix nói bạn cũng có thể sử dụng 'asyncTest()' thay vì 'test()' để tránh gọi 'stop()' và làm cho nó rõ ràng rằng đây là một thử nghiệm không đồng bộ. –

2

tôi đã thực hiện một số thử nghiệm qunit với ajax. nó không đẹp. điều tốt nhất tôi có thể đi cùng là dừng thử nghiệm khi ajax bị sa thải và bắt đầu lại trong lần gọi lại thành công. (sử dụng các phương thức start() và stop()). Điều này có nghĩa là một yêu cầu ajax tại một thời điểm, nhưng tôi có thể sống với điều đó. Chúc may mắn

+0

Bắt đầu và dừng dường như đang hoạt động! Giải pháp được đăng trong bài đăng dưới đây. Cảm ơn! – azamsharp

+0

Nhưng tôi tự hỏi tại sao phương pháp trên của tôi không hiệu quả. Tôi có thể truy cập phản hồi và mọi thứ. Dường như các bằng đều thất bại! – azamsharp

+2

tôi nghĩ rằng vì tính chất không đồng bộ của ajax, bài kiểm tra đã kết thúc trước khi phản hồi trở lại – mkoryak

13

Vấn đề thực sự ở đây không cần gọi phương thức start() và stop() - bạn có thể gặp rắc rối khi sử dụng phương pháp đó nếu bạn không cẩn thận khi gọi dừng() một lần nữa kết thúc cuộc gọi lại của bạn nếu bạn có các phương thức .ajax() bổ sung. Mà sau đó có nghĩa là bạn thấy mình trong một số mess snarled của việc phải theo dõi nếu tất cả các callbacks đã được bắn để biết nếu bạn vẫn cần phải gọi stop() một lần nữa.

Gốc của vấn đề liên quan đến hành vi mặc định yêu cầu không đồng bộ - và các giải pháp đơn giản là làm cho .ajax() yêu cầu xảy ra đồng bộ bằng cách thiết lập async tài sản để sai:

test("synchronous test", function() { 
    $.ajax({ 
    url:'Sample.asmx/Service', 
    async:false, 
    success: function(d,s,x) { ok(true, "Called synchronously"); } 
    }); 
}); 

Thậm chí vẫn còn, cách tiếp cận tốt nhất là cho phép hành vi không đồng bộ và sử dụng lời gọi phương thức thử nghiệm đúng: asyncTest(). Theo các tài liệu "kiểm tra không đồng bộ đang xếp hàng đợi và chạy một sau khi khác. Tương đương với cách gọi một bài kiểm tra bình thường() và ngay lập tức gọi stop()."

asyncTest("a test", function() { 
    $.ajax({ 
    url: 'Sample.asmx/Service', 
    success: function(d,s,x) { 
     ok(true, "asynchronous PASS!"); 
     start(); 
    } 
    }); 
}); 
+0

asyncTest (tên, ...) là một phương pháp thuận tiện để kiểm tra (tên, hàm() {stop(); ...}). Làm tổ = ý tưởng tồi. –

+0

@ Jörn - cảm ơn vì đã chỉ ra cách làm tổ. Đọc lại câu trả lời này Tôi không chắc tại sao tôi lại bọc nó ở nơi đầu tiên khác hơn là để minh họa cho bạn. Tôi đã gỡ bỏ phương thức asyncTest để làm cho nó rõ ràng hơn cách nó được dự định sẽ được sử dụng. – Goyuix

3

Có rất nhiều thử nghiệm QUnit trong dự án của tôi . như:

module("comment"); 
    asyncTest("comment1", function() { 
     expect(6); 
     $.ajax({ 
     url: 'http://xxx.com/comment', 
     dataType: "json", 
     type: "GET", 
     timeout: 1000 
     }).done(function(data) { 
     ok(true, "loaded"); 
     ok(data.data.length>1, "array size"); 
     ok(data.total, "attr total"); 
     var c = data.data[0]; 
     ok(c.id, "attr c.id"); 
     ok(c.user_id, "attr c.user_id"); 
     ok(c.type == 4, "attr c.type equal 4"); 
     }).fail(function(x, text, thrown) { 
     ok(false, "ajax failed: " + text); 
     }).always(function(){ 
     start(); 
     }); 
    }); 
Các vấn đề liên quan