如何从AMD模块中的方法返回json?

时间:2015-10-08 06:42:18

标签: jquery json requirejs qunit

在尝试测试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
...

1 个答案:

答案 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();
});