How to fake jquery.ajax() response?

前端 未结 6 503
孤独总比滥情好
孤独总比滥情好 2020-12-07 20:56

I am writing some QUnit tests for a JavaScript that makes AJAX calls.

For isolation I overwrite $.ajax to write the parameter array of an AJAX call to a

6条回答
  •  旧巷少年郎
    2020-12-07 21:03

    Use a closure to override $.ajax with a dummy response

    After trying the accepted answer and the answer posted by user1634074, I devised this simple and flexible blend of the two.

    In its most basic form…

    function ajax_response(response) {
      return function (params) {
        params.success(response);
      };
    }
    $.ajax = ajax_response('{ "title": "My dummy JSON" }');
    

    In the above example, define a function ajax_response() that accepts some JSON string as an argument (or any number of custom arguments useful for simulating a response) and returns an anonymous closure function that will be assigned to $.ajax as an override for unit testing.

    The anonymous function accepts a params argument which will contain the settings object passed to the $.ajax function. And it uses the argument(s) passed to the outer function to simulate a response from the server. In this example, it always simulates a successful response from the server, by simply invoking the success callback and supplying it with the dummy JSON.

    It is easy to reconfigure…

    function ajax_response(response, success) {
      return function (params) {
        if (success) {
          params.success(response);
        } else {
          params.error(response);
        }
      };
    }
    
    // Simulate success
    $.ajax = ajax_response('{ "title": "My dummy JSON." }', true); 
    doAsyncThing(); // Function that calls $.ajax
    
    // Simulate error
    $.ajax = ajax_response('{ "error": "Who is the dummy now?" }', false); 
    doAsyncThing(); // Function that calls $.ajax
    

    Below we can see it in action…

    /* FUNCTION THAT MAKES AJAX REQUEST */
    function doAsyncThing() {
      $.ajax({
        type: "POST",
        url: "somefile.php",
        // data: {…},
        success: function (results) {
          var json = $.parseJSON(results),
              html = $('#ids').html();
          $('#ids').html(html + '
    ' + json.id); } }); } /* BEGIN MOCK TEST */ // CREATE CLOSURE TO RETURN DUMMY FUNCTION AND FAKE RESPONSE function ajax_response(response) { return function (params) { params.success(response); }; } var n = prompt("Number of AJAX calls to make", 10); for (var i = 1; i <= n; ++i) { // OVERRIDE $.ajax WITH DUMMY FUNCTION AND FAKE RESPONSE $.ajax = ajax_response('{ "id": ' + i + ' }'); doAsyncThing(); } /* END MOCK TEST */
    
    

    IDs:

提交回复
热议问题