2013-05-15 27 views
9

tôi đã không có vấn đề phân loại ra chế giễu điều kiện thành công, nhưng dường như không thể hiểu được làm thế nào để chế nhạo sự thất bại/điều kiện thời gian chờ khi sử dụng Sinon và QUnit để kiểm tra và chức năng ajax:Làm cách nào để giả lập phản hồi 'hết giờ' hoặc 'lỗi' bằng Sinon/Qunit?

tôi thiết lập là thế này:

$(document).ready(function() { 

    module("myTests", { 
     setup: function() { 
      xhr = sinon.sandbox.useFakeXMLHttpRequest(); 
      xhr.requests = []; 
      xhr.onCreate = function (request) { 
       xhr.requests.push(request); 
      }; 

      myObj = new MyObj("#elemSelector"); 
     }, 
     teardown: function() { 
      myObj.destroy(); 
      xhr.restore(); 
     } 
    }); 

và kiểm tra trường hợp thành công của tôi, chạy hạnh phúc và nhận/đi qua các dữ liệu nhận được với phương pháp thành công là thế này:

test("The data fetch method reacts correctly to receiving data", function() { 
     sinon.spy(MyObject.prototype, "ajaxSuccess"); 

     MyObject.prototype.fetchData(); 

     //check a call got heard 
     equal(1, xhr.requests.length); 

     //return a success method for that obj 
     xhr.requests[0].respond(200, { "Content-Type": "application/json" }, 
       '[{ "responseData": "some test data" }]'); 

     //check the correct success method was called 
     ok(MyObj.prototype.ajaxSuccess.calledOnce); 

     MyObj.prototype.ajaxSuccess.restore(); 
    }); 

Tuy nhiên, tôi không thể làm việc ra những gì tôi nên được đặt thay vì này:

 xhr.requests[0].respond(200, { "Content-Type": "application/json" }, 
       '[{ "responseData": "some test data" }]'); 

để làm cho trình xử lý cuộc gọi ajax của tôi 'nghe' một phương pháp thất bại hoặc hết giờ? Điều duy nhất tôi có thể nghĩ để thử là:

 xhr.requests[0].respond(408); 

Nhưng nó không hoạt động.

Tôi đang làm gì sai hoặc tôi đã hiểu lầm điều gì? Tất cả trợ giúp được đánh giá cao :)

+0

Thời gian chờ là thiếu phản hồi trong thời gian nhất định, vì vậy bạn không thể trả lại thời gian chờ –

+0

Tôi đã hy vọng tội lỗi có thể vượt qua điều đó và cung cấp giao diện chuẩn cho tất cả các loại phản hồi. Nếu tôi không thể 'trả lại' một thời gian chờ bằng cách sử dụng tội lỗi - thì làm thế nào để giả mạo? –

+0

Tôi không biết tội lỗi vì vậy có thể có một cái gì đó cụ thể, nhưng thông thường bạn đặt thời gian chờ để nói 1ms, và sử dụng chờ đợi trên máy chủ hoặc phía máy chủ giả. –

Trả lời

0

Vì thời gian chờ, fake timers của sinon có thể hữu ích. Sử dụng chúng, bạn sẽ không cần phải đặt thời gian chờ thành 1ms. Đối với những thất bại, cách tiếp cận của bạn looks correct với tôi. Bạn có thể cho chúng tôi thêm mã, đặc biệt là trình xử lý lỗi không?

0

Làm một cái gì đó như thế này

requests[0].respond(
     404, 
     { 
      'Content-Type': 'text/plain', 
      'Content-Length': 14 
     }, 
     'File not found' 
); 

hoạt động để kích hoạt callback 'lỗi' trong các yêu cầu jQuery AJAX.

Đối với timouts, bạn có thể sử dụng đồng hồ sinons giả như thế này:

test('timeout-test', function() { 
    var clock = sinon.useFakeTimers(); 
    var errorCallback = sinon.spy(); 

    jQuery.ajax({ 
     url: '/foobar.php', 
     data: 'some data', 
     error: errorCallback, 
     timeout: 20000 // 20 seconds 
    }); 

    // Advance 19 seconds in time 
    clock.tick(19000); 

    strictEqual(errorCallback.callCount, 0, 'error callback was not called before timeout'); 

    // Advance another 2 seconds in time 
    clock.tick(2000); 

    strictEqual(errorCallback.callCount, 1, 'error callback was called once after timeout'); 
}); 
+1

Có lẽ là cách để đi cho Ajax của jQuery, nhưng CJ đã hỏi về XHR giả mạo của sinon; không cách nào trong số các phương pháp này làm việc cho sinon. –

-1

cài đặt thời hạn trên $.ajax() cuộc gọi của bạn và sử dụng Sinon fake timers để di chuyển đồng hồ về phía trước trước khi trả lời.

+0

CJ không thực hiện cuộc gọi $ .ajax(), nhưng một cuộc gọi XHR giả mạo sinon và sinon không hỗ trợ thuộc tính .timeout. –

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