2015-10-08 84 views
-1

我一直想測試我的JSON對象的存在時得到「未定義」。我不懂爲什麼?如何從AMD模塊內的方法返回json?

修訂: 我看過......在深入...這裏列出的職位... How do I return the response from an asynchronous call?

在該職位對大多數史詩的回答的最後,作者提到了根本就沒有使用$ .getJSON。我不認爲這是我的選擇。我的情況不同,我需要使用$ .getJSON才能獲得json。另外,我的配置不同之處在於,我的$ .getJSON調用位於AMD模塊內的原型方法內。那篇文章確實幫助我明白,我可以返回整個$ .getJSON回來,我已經更新了我的代碼,以反映這一點。所以,現在...

什麼我需要做的,這樣當我打電話從我的測試文件codelib.gotjson和測試結果對象裏面的東西的價值?

注:我可以在我的鉻控制檯console.dir「對象」(結果)讓我看看裏面看。而在這個對象裏面,我可以看到一個「responseText」,其中包含了我之後珍貴的json字符串。但我現在停留在如何爲它寫一個斷言?

我想寫類似....

assert.equal(Object.responseText.name, 「鮑勃」, 「等於鮑勃」)

我現在SOOOO接近。任何幫助表示讚賞。謝謝。

codelib.js

"use strict"; 

define(function() { 
    //constructor 
    function Codelib(a,b){ 
    // if u had passed vars 
    this.b = b; 
    this.a = a; 
    } 

    //methods 
    Codelib.prototype.code = function(a, b) { 
    return (a + b); 
    }; 

    //methods 
    Codelib.prototype.gotjson = function() { 
     return $.getJSON("https://api.twitch.tv/kraken/streams/MedryBW") 
      .done(function (data) { 
      console.log('gotJSON: '); 
      console.dir(data); 
      }) 
      .fail(function (jqxhr, textStatus, error) { 
      var err = textStatus + ", " + error; 
      console.log("Request Failed: " + err); 
      }); 
    }; 


    return Codelib; 
}); 

測試文件codeTest.js

"use strict"; 
define(['src/codelib','jquery'], function(Codelib){ 
    var run = function(){ 
    QUnit.test('code should return the sum of the two supplied numbers.',function(assert){ 
     var codelib = new Codelib(); 
     assert.equal(codelib.code(1,1),2, 'The return should be 2.'); 
     assert.equal(codelib.code(-2,1),-1, 'The return should be -1.'); 
    }); 

    QUnit.test("As a user, I can see whether MedryBW is currently streaming on Twitch.tv",function(assert){ 
    var codelib = new Codelib(); 
    var result = codelib.gotjson(); 
    console.log('in test: '); 
    console.dir(result); 

     assert.equal(codelib.gotjson(),1, 'should be true'); 
    }); 

    }; 
    return {run: run} 
}); 

注:鉻控制檯發現結果對象:

Object: 
... 
responseText: "{"_links": {"self":"https://api.twitch.tv/kraken/streams/medrybw"...etc 
... 
+0

的可能的複製[?如何返回從異步調用的響應(http://stackoverflow.com/questions/14220321/how-to-return-the-response-從異步通話) – Louis

回答

0

在那個崗位接近尾聲那最史詩般的答案,作者提到根本不使用$ .get JSON。

我想你是誤會了答案的一部分。如果您希望Ajax請求同步,則不能使用$.getJSON。然而,你不應該事件要請求是同步。我的意思是,該部分的標題爲「不推薦:同步‘AJAX’通話」,我的意思是不建議當我說:)


您應該使用回調或承諾處理響應,正如答案的前面所解釋的那樣。在那裏,它說你應該返回的$.getJSON的返回值(一個承諾/延期對象):

Codelib.prototype.gotjson = function() { 
    return $.getJSON("https://api.twitch.tv/kraken/streams/MedryBW"); 
}; 

,並有調用代碼註冊回調:

codelib.gotjson().done(function(result) { 
    assert.equal(result, 1, 'should be true'); 
}); 

然而,QUnit預計測試是同步的,所以它不會等到收到Ajax響應。幸運的是,QUnit supports async tests還有:

var done = assert.async(); 
codelib.gotjson().done(function(result) { 
    assert.equal(result, 1, 'should be true'); 
    done(); 
}); 
+0

哦,非常感謝,我現在試試。 – Jessi