Javascript 如何在Mocha测试中等待getJSON完成?

Javascript 如何在Mocha测试中等待getJSON完成?,javascript,unit-testing,mocha.js,yeoman,chai,Javascript,Unit Testing,Mocha.js,Yeoman,Chai,以下文件位于使用Yeoman的generator webappgenerator创建的项目中。我的脚本在浏览器中工作,并从JSON文件返回信息,但大部分时间在测试中不起作用。测试有时会成功,这意味着测试遇到了一个足够长的停顿,使得getJSON能够及时返回数据。在我的搜索中,我找到了各种资源,这里有两个听起来应该解决我的问题的资源:stackoverflow和 它们都涉及将done参数传递给it函数,然后调用done()执行测试后。至少,这是我的理解,但它仍然不起作用。我觉得我错过了一些非常明显

以下文件位于使用Yeoman的
generator webapp
generator创建的项目中。我的脚本在浏览器中工作,并从JSON文件返回信息,但大部分时间在测试中不起作用。测试有时会成功,这意味着测试遇到了一个足够长的停顿,使得getJSON能够及时返回数据。在我的搜索中,我找到了各种资源,这里有两个听起来应该解决我的问题的资源:stackoverflow和

它们都涉及将
done
参数传递给
it
函数,然后调用
done()执行测试后。至少,这是我的理解,但它仍然不起作用。我觉得我错过了一些非常明显的东西

下面是
app/scripts/source data.js

var source = (function() {
    var sourceData = null;

    _loadData();

    function _loadData(done) {
        $.getJSON("app/data/source.json", function(data) {
            sourceData = data;
        });
    }

    function getData() {
        return sourceData;
    }

    return {
        getData: getData
    };
})();
下面是
test/spec/sourcedata.js

(function() {
    describe("Source Data", function() {
        describe("Data for External Modules", function() {
            it("returns the source data from a file", function(done){
                expect(source.getData().spec[0].name).to.equal("Spec");
                done();
            });
        });
    });
})();
我试图改变调用
done()
的位置,因为我的理解是
done()
告诉Mocha在getJSON完成后继续进行其余的测试。然而,在这一点上,这只是尝试和错误,因为我发现我没有真正的理解

...
var data = source.getData();
done();
expect(data.spec[0].name).to.equal("Spec");
...
在上面的步骤之后,我在主脚本中尝试了
setTimeout
,但仍然没有成功!即使是这样,我也不认为我应该在这种情况下使用
setTimeout
,而是正确地等待
getJSON
的解析,您应该使用callback。 例如:

var source = (function() {
  var sourceData;

  function getData(done) {
    if(sourceData){
      done(sourceData);
    } else {
      $.getJSON("app/data/source.json", function(data) {
        sourceData = data;
        done(data);
      });
    }
  }
  return {
    getData: getData
  };
})();
测试将是这样的

(function() {
  describe("Source Data", function() {
    describe("Data for External Modules", function() {
      it("returns the source data from a file", function(done){
        source.getData(function(sourceData){
          expect(sourceData.spec[0].name).to.equal("Spec");
          done();
        });
      });
    });
  });
})();

返回
$.getJSON
@DanielA.White的承诺,谢谢,这帮助我找到了一个解决方案。我从上面的评论中找到了一个解决方案,但我发现你的解决方案更简洁,我同意了。谢谢