2012-01-17 30 views
11

Làm cách nào để kiểm tra onreadystatechange trên XMLHttpRequest hoặc JavaScript AJAX thuần túy mà không có jQuery? Tôi đang làm điều này bởi vì tôi đang phát triển phần mở rộng của Firefox. Tôi đoán tôi phải sử dụng gián điệp, nhưng không thể tìm ra cách vì ajax của tôi sẽ không trả lại bất cứ thứ gì.Làm thế nào để kiểm tra XMLHttpRequest với Jasmine

 

    submit : function() { 
     var url = window.arguments[0]; 
     var request = new XMLHttpRequest(); 
     request.open("POST", 'http://'+this.host+'/doSomething', true); 
     request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
     request.send("param="+param+"&emotions="+this.getParams()); 
     request.onreadystatechange = function() { 
      if(this.readyState == 4) { 
       // alert(this.responseText); 
      } 
     }; 

    } 
 
+0

bản sao có thể có của [Cách tạo sơ khai cho chức năng ajax bằng cách sử dụng Jasmine BDD] (http://stackoverflow.com/questions/8884060/how-to-create-stub-for-ajax-function-using-jasmine-bdd) –

+1

Vâng, cái đó đang sử dụng jQuery, nhưng tôi đang cố gắng sử dụng XMLHttpRequest thuần túy. – toy

+0

Chắc chắn nhưng câu trả lời (sử dụng khung mocking SininJS) cũng đang hoạt động cho trường hợp của bạn. –

Trả lời

-1

Theo bản fax của mã bên dưới, bạn có thể sẽ tiêm console.log() với mã trạng thái và văn bản trạng thái.

Điều này sẽ giúp bạn xác định mọi lỗi http. Cụ thể, tôi muốn nói trạng thái sẽ trả về 404.

submit : function() { 
    var url = window.arguments[0]; 
    var request = new XMLHttpRequest(); 
    request.open("POST", 'http://'+this.host+'/doSomething', true); 
    request.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); 
    request.send("param="+param+"&emotions="+this.getParams()); 
    request.onreadystatechange = function() { 
     console.log(this.status+ " - "+ this.statusText); 
    }; 

} 

Một giải pháp thay thế là xem xét tiêu đề/phản hồi yêu cầu trong bảng điều khiển firebug. Đó là một điểm tốt: Nếu bạn không sử dụng công cụ firebug hoặc chrome dev, bạn nên thay đổi giao diện console.log() để gọi thứ gì đó gắn chuỗi vào đối tượng tài liệu không sử dụng lệnh gọi alert().

How do I verify jQuery AJAX events with Jasmine?. Một câu trả lời tương tự thực hiện Jasmine.

+0

Hmm, bạn có thể cho tôi xem mã từ Jasmine được không? – toy

+0

Tôi không quen thuộc với Jasmine tuy nhiên tôi đã thêm một liên kết để trả lời của tôi mà chỉ đến một câu trả lời từ một chủ đề tương tự mà dường như là bài kiểm tra Jasmine bạn đang tìm kiếm. – CBusBus

29

Còn cái này thì sao?

beforeEach(function() { 
    // spyOn(XMLHttpRequest.prototype, 'open').andCallThrough(); // Jasmine 1.x 
    spyOn(XMLHttpRequest.prototype, 'open').and.callThrough(); // Jasmine 2.x 
    spyOn(XMLHttpRequest.prototype, 'send'); 
}); 

... 

it("should call proper YQL! API", function() { 
    podcast.load_feed('http://www.faif.us/feeds/cast-ogg/'); 

    expect(XMLHttpRequest.prototype.open).toHaveBeenCalled(); 
}); 

Hoa nhài nguyên chất mà không cần sử dụng bất kỳ thư viện bên ngoài nào.

+1

Điều này làm việc cho tôi. Nhưng làm thế nào để mô phỏng xử lý phản ứng xhr như onError, onLoad, vv? – sonam

2

Bạn có thể kiểm tra nó theo cách đó

it("should make XHR request", function() { 

    // arrange 

    var xhr = { 
     open: jasmine.createSpy('open') 
    }; 

    XMLHttpRequest = jasmine.createSpy('XMLHttpRequest'); 
    XMLHttpRequest.and.callFake(function() { 
     return xhr; 
    }); 

    // act 

    submit(); 

    // assert 

    expect(xhr.open).toHaveBeenCalled(); 
}); 
0

Được cung cấp bởi jasmine-ajax. Để thử cho việc sử dụng đặc tả đơn withMock:

it("allows use in a single spec", function() { 
    var doneFn = jasmine.createSpy('success'); 
    jasmine.Ajax.withMock(function() { 
     var xhr = new XMLHttpRequest(); 
     xhr.onreadystatechange = function(args) { 
     if (this.readyState == this.DONE) { 
      doneFn(this.responseText); 
     } 
     }; 

     xhr.open("GET", "/some/cool/url"); 
     xhr.send(); 

     expect(doneFn).not.toHaveBeenCalled(); 

     jasmine.Ajax.requests.mostRecent().respondWith({ 
     "status": 200, 
     "responseText": 'in spec response' 
     }); 

     expect(doneFn).toHaveBeenCalledWith('in spec response'); 
    }); 
    }); 

Câu trả lời chỉ được gửi khi bạn sử dụng respondWith. Chỉ cần download the file và thêm làm src vào số SpecRunner.html của bạn. Sử dụng ví dụ tại https://github.com/serv-inc/JSGuardian (xem thư mục kiểm tra).

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