4

Jasmine BDD フレームワークで ajax を実行する際に問題があります。

偽の応答をするのではなく、実際の ajax 呼び出しをテストしたい。ドキュメントを読んですべてを試しましたが、ajax コードは単に無視されているようです。私もスパイを使ってみましたが、役に立たないようです。

機能しない非常に基本的な例:

describe("A jQuery ajax test", function() {
  it("should make AJAX request", function () {
    expect(testAjax()).toBe(1);
  });
});

function testAjax() {
  var ret=0
  $.ajax({
    type: "GET",
    url: "obj.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){ret=1;}
  });
  return ret;
}

戻り値は常に 0 で、success 関数には入りません。

私は何を間違っていますか?

4

3 に答える 3

2

私自身の質問に答えます。Jasmine での Ajax 呼び出しは非同期である必要があります。テストできるようにコードを変更したくない場合は、ajaxSetup を使用して async のデフォルト値を false に設定できます。

it("getsetting", function () {
  $.ajaxSetup({
    async:false
  });
  expect(getUserSetting(101,0)).toBe('30');
});
于 2011-09-26T09:33:11.173 に答える
1

async を false に設定すると問題は解決しますが、ajax 呼び出し中にページ全体がロックされるため、ほとんどの Web アプリケーションでは通常、これはオプションではありません。

Web サービスから応答を受け取ったときに実行される te​​stAjax() メソッドにコールバック関数を渡します。その後、コールバック内で assertion(expect) を作成できます。

次のようになります。

function testAjax(callback) {
  var ret=0
  $.ajax({
    type: "GET",
    url: "obj.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data){
        callback(ret);
    },
    error:function(){
       callback(ret);
    }
  });
}

describe("A jQuery ajax test", function() {
  it("should make AJAX request", function () {
     testAjax(function(ret){
        expect(ret).toBe(1);
     });    
  });
});
于 2011-10-31T09:12:03.677 に答える
0

jasmine を使用して統合テストを書きたいとのことですが、それは jasmine の非同期サポートのおかげで可能です。次の例が、jasmine の非同期機能を使用して実際の統合テストを作成する方法を理解するのに役立つことを願っています。

describe("A jQuery ajax test", function() {

it("should make AJAX request", function () {
var return = null;


 runs(function(){
 // hosts actual ajax call
      return = testAjax();
 });

 waitsFor(function(){
 //this method polls until the condition is true or timeout occurs,whichever occurs first
 return return.readyState==4;
 },"failure message",700//timeout in ms
 );

runs(function(){
 // 2nd runs block can be used to verify the actual change in state
 // Add other relevant expectation according to your application context.
      expect(return).toBeTruthy();

 });

});

});

function testAjax() {
// result here is a deffered object whose state can be verified in the test
var result = null;
result = $.ajax({
    type: "GET",
    url: "obj.json",
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function() { //do something on success}
    });
return ret;
}​

注意: AJAX 呼び出しの実行中はCross-origin_resource_sharingによって制限され 、サーバーは応答の一部としてヘッダー "Access-Control-Allow-Origin:your requesting domain " を返す必要があります。

于 2012-12-29T21:06:36.330 に答える