如何在使用jasmine进行测试之前等待所有ajax调用

时间:2013-06-07 14:01:20

标签: javascript xmlhttprequest jasmine

我想在开始测试我的jasmine之前等待所有远程文件加载之前(因为我不想在我的specfile中处理waitsForspyes,但仅在开始时的文件)

loadDoc是我为加载远程文件而创建的函数

loadDoc = function(path, callBack, noDocx) {
var xhrDoc;

if (noDocx == null) {
  noDocx = false;
}
xhrDoc = new XMLHttpRequest();
docxCallback[path] = callBack;
xhrDoc.open('GET', "../examples/" + path, true);
if (xhrDoc.overrideMimeType) {
  xhrDoc.overrideMimeType('text/plain; charset=x-user-defined');
}
xhrDoc.onreadystatechange = function(e) {
  if (this.readyState === 4 && this.status === 200) {
    window.docXData[path] = this.response;
    if (noDocx === false) {
      window.docX[path] = new DocxGen(this.response);
    }
    return docxCallback[path]();
  }
};
return xhrDoc.send();
};

试验:

describe("DocxGen", function() {
var globalcallBack;
globalcallBack = jasmine.createSpy();
loadDoc('imageExample.docx', globalcallBack);
loadDoc('image.png', globalcallBack, true);
....
waitsFor(function() {
  return globalcallBack.callCount >= 10;
});



describe(...)
....
})

1 个答案:

答案 0 :(得分:0)

为了解决这个问题,我使用了同步Ajax请求,因此Jasmine Block的代码执行仅在加载所有文档后才开始。

这是我在文件开头的代码(我假设您要将文件存储在名为fileLoaded的数组中。

window.fileLoaded=[]

DocUtils.loadDoc= function(path)
{
    xhrDoc = new XMLHttpRequest();
    xhrDoc.open('GET', path, false); //This line makes the call asynchronous (the false)
    xhrDoc.onreadystatechange = function(e) {
        if (this.readyState === 4) {
                if (this.status === 200) {
                    window.fileLoaded[path]=this.response;
                } 
                else {
                    console.log('error loading doc');
                    if (callback != null) {
                    return callback(true);
                }
            }
        }
    };
    xhrDoc.send();
}

DocUtils.loadDoc('tagExampleExpected.docx')
DocUtils.loadDoc('tagLoopExample.docx')
DocUtils.loadDoc('tagLoopExampleImageExpected.docx')
DocUtils.loadDoc('tagProduitLoop.docx')