Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用jasmineajax来验证send方法是否被调用?_Javascript_Ajax_Jasmine_Jasmine Ajax - Fatal编程技术网

Javascript 如何使用jasmineajax来验证send方法是否被调用?

Javascript 如何使用jasmineajax来验证send方法是否被调用?,javascript,ajax,jasmine,jasmine-ajax,Javascript,Ajax,Jasmine,Jasmine Ajax,如果我从未调用send方法,那么jasmineajax是否应该调用onreadystatechange并将readyState设置为4 如果上述行为不是预期的行为,我如何使用jasmineajax验证调用了send方法 下面是正在测试的代码: Loader = (function() { var loadNames = function(url, success_callback, error_callback) { var ajax = new XMLH

如果我从未调用
send
方法,那么
jasmineajax
是否应该调用
onreadystatechange
并将
readyState
设置为4

如果上述行为不是预期的行为,我如何使用
jasmineajax
验证调用了
send
方法

下面是正在测试的代码:

    Loader = (function() {

      var loadNames = function(url, success_callback, error_callback) {

        var ajax = new XMLHttpRequest();

        ajax.open("GET", url);
        ajax.onreadystatechange = function () {
          console.log("Ready state is " + ajax.readyState);
          if (ajax.readyState === 4 && ajax.status === 200) {
            success_callback(JSON.parse(ajax.responseText));
          } else if (ajax.readyState === 4 && ajax.status !== 200) {
            error_callback("There was a problem. Status returned was " + ajax.status);
          }
        };

        ajax.onerror = function () {
         error_callback("Unknown error");
        };

        // Shouldn't removing the call to send prevent
        // onredystatechange from being called with readyState 4?
        // ajax.send();
      };

      return {
        loadNames: loadNames
      };

    })();
以下是测试:

describe("Loader", function () {

  var successFunction, failFunction;

  beforeEach(function () {
    jasmine.Ajax.install();
    successFunction = jasmine.createSpy("successFunction");
    failFunction = jasmine.createSpy("failFunction");
  });

  afterEach(function () {
    jasmine.Ajax.uninstall();
  });

  describe("#loadNames", function () {    
    it("Makes a success callback with the data when successful", function () {
      Loader.loadNames("someURL", successFunction, failFunction);
      jasmine.Ajax.requests.mostRecent().respondWith({
        "status": 200,
        "contentType": 'application/json',
        "responseText": '[1, 2, 4, 3, 5]'
      });

      // Shouldn't this fail since I never called send?
      expect(successFunction).toHaveBeenCalledWith([1, 2, 4, 3, 5]);
    });
  });
});

我很惊讶地看到调用了
successFunction
,因为测试中的代码从未调用
ajax.send()
。如果这是库的预期行为,那么我如何
spyOn
底层的
ajax
对象,以便验证测试中的代码是否调用
send

是的,您没有调用
ajax.send()
,但是由于这段代码,您正在触发
ajax.onreadystatechange
事件:

jasmine.Ajax.requests.mostRecent().respondWith({
  "status": 200,
  "contentType": 'application/json',
  "responseText": '[1, 2, 4, 3, 5]'
});
它更改readystate并将readystate设置为“完成”。事实上,这正是文件中所说的:

至于如何检查是否确实调用了xhr.send,这说明您可以在每次调用之前执行以下操作来监视它:

spyOn(XMLHttpRequest.prototype, 'send');
在取消加载程序中xhr.send()部分的注释后,可以检查以下方法调用:

describe("#loadNames", function () {    
  it("Makes a success callback with the data when successful", function () {
    Loader.loadNames("someURL", successFunction, failFunction);
    jasmine.Ajax.requests.mostRecent().respondWith({
      "status": 200,
      "contentType": 'application/json',
      "responseText": '[1, 2, 4, 3, 5]'
    });

    expect(XMLHttpRequest.prototype.open).toHaveBeenCalled();
  });
});

从该页面我不清楚
respondWith
是否会在未调用
send
的情况下触发回调;但是,知道我正在观察预期的行为是有帮助的。值得一提的是,使用
stubRequest
也会产生我需要的行为。@Zack是的,这部分没有解释得那么好,它有点隐含了:
jasmine.Ajax.requests.mostRecent().respondWith({“status”:200,“contentType”:“text/plain”,“responseText”:“awesponse”});期望(doneFn)。得到“令人敬畏的响应”。这似乎会触发文档中的
doneFn
回调,这相当于您的
successFunction