在尝试测试json对象的存在时,我一直“未定义”。我不明白为什么?
REVISION: 我已经阅读了......深入...这里列出的帖子...... How do I return the response from an asynchronous call?
在该帖子即将结束那个最具史诗般的答案时,作者提到不要使用$ .getJSON。在我的情况下,我不认为这是一个选项。我的情况不同,我需要使用$ .getJSON才能获得json。另外,我的配置不同,因为我的$ .getJSON调用是在AMD模块内的原型方法内。那篇文章确实帮助我理解我可以返回整个$ .getJSON,并且我已经更新了我的代码来反映这一点。所以现在......
当我从测试文件中调用codelib.gotjson并测试结果对象内部的值时,我需要做什么?
注意:我可以在Chrome控制台的“对象”中看到console.dir(result)让我看到。在那个对象里面,我可以看到一个“responseText”,里面包含着我珍贵的珍贵json字符串。但我现在仍然坚持如何为它写一个断言?
我想写点......
assert.equal(Object.responseText.name,“bob”,“等于bob”)
我现在太近了。任何帮助表示赞赏。谢谢。
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}
});
注意:在Chrome控制台中找到了结果对象:
Object:
...
responseText: "{"_links": {"self":"https://api.twitch.tv/kraken/streams/medrybw"...etc
...
答案 0 :(得分:0)
在该帖子即将结束那个最具史诗般的答案时,作者提到不要使用$ .getJSON。
我认为你误解了那部分答案。如果希望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();
});