2015-02-24 60 views
0

我在學習測試,所以我使用karma,karma-jasmine和sinon.js構造了這個簡單的例子: 我有一個ajax請求,成功時它設置一個全局變量。 隨着sinon fakeServer我假裝的迴應,一切都很好,如果我手動發出sinon.server.respond()函數的響應。 但是將sinon fakeServer更改爲autoRespond = true,請不要按預期發音。測試失敗,因爲全局變量仍未定義。在我看來,設置爲autoRespond = true時,fakeRequest不會回答。 有沒有人建議爲什麼?謝謝你的幫助。 代碼來測試:sinon server.autoRespond

var requestResult; // global variable 


function loadFirstData() { 

    var request = $.ajax({ 
          url  : "/rest/first/", 
          type : "GET", 
          timeout : 5000, 
          dataType: "json" 
         }); 

    request.done(function (data) { 
     requestResult = data; 
    }); 

    request.fail(function (jqXHR, textStatus) { 
     console.error("Request failed: " + textStatus); 
     console.error("Object: ", jqXHR); 
    }); 
} 

測試:

describe('Ajax requests', function() { 
    var xhr; 

    beforeEach(function() { 
    xhr = sinon.fakeServer.create(); 

    // this doesn't work 
    //xhr.autoRespond = true; 

    xhr.respondWith(
     'GET', 
     '/rest/first/', 
     function (request) { 
      request.respond(
       200, 
       { "Content-Type": "application/json" }, 
       '{ "returnValue": 20.13 }' 
      ); 
     } 
    ); 
    xhr.respondWith(
     'GET', 
     'rest/second/', 
     function (request) { 
      request.respond(
       200, 
       { "Content-Type": "application/json" }, 
       '{ "returnValue": 3333 }' 
      ); 
     } 
    ); 


    }); 

    afterEach(function() { 
    xhr.restore(); 
    }); 

    it('should get first data', function() { 
    loadFirstData(); 

    // this works 
    xhr.respond(); 

    expect(requestResult).toEqual({ "returnValue": 20.13 }); 


    }); 

}); 

回答

0

我自己找到了答案。 :) Sinon假服務器不會立即迴應請求,但延遲很短。所以我必須使用done()函數異步地進行茉莉花測試。 所以下面的代碼工作:

describe('Ajax requests', function() { 
    var xhr; 

    // beforeEach get the jasmine done as argument 
    beforeEach(function(done) { 
    xhr = sinon.fakeServer.create(); 

    // autoRespond is set 
    xhr.autoRespond = true; 

    xhr.respondWith(
     'GET', 
     '/rest/first/', 
     function (request) { 
     request.respond(
      200, 
      { "Content-Type": "application/json" }, 
      '{ "returnValue": 20.13 }' 
     ); 
     } 
    ); 
    xhr.respondWith(
     'GET', 
     'rest/second/', 
     function (request) { 
     request.respond(
      200, 
      { "Content-Type": "application/json" }, 
      '{ "returnValue": 3333 }' 
     ); 
     } 
    ); 

    // starts the tests 
    done(); 

    }); 

    afterEach(function() { 
    xhr.restore(); 
    }); 

    // the asynchronous test get the jasmie done as argument, as well 
    it('should get first data', function (done) { 
    loadFirstData(); 

    // delays the expectations check 
    setTimeout(function() { 
     expect(requestResult).toEqual({ "returnValue": 20.13 }); 

     // says jasmine the test is finished 
     done(); 
    }, 500); 

    }); 

}); 
+0

對不起,但這是一個不好的做法。 – MeIr 2016-03-18 17:47:51

0

興農文檔狀態autoRespond不適合你發現的原因測試。

我最終在fakeServer上實現了respondImmediately屬性,它將同步響應任何請求。這幾個星期前剛剛合併到項目中(v1.14.0),但如果你更新到最新版本,你應該能夠得到它。 Check out the docs here.

而不是將autoRespond屬性設置爲true,請將respondImmediately屬性設置爲true。然後,您可以刪除所有異步done調用,並根據您的期望刪除包裝。希望這有助於整理你的測試!