如何使用使用自己的XMLHttpRequest而不是$ http的库来测试服务

时间:2016-09-24 13:23:59

标签: javascript angularjs unit-testing jasmine

我的角色服务看起来像

function userService() {
  // A library provide methods that not used $http service and not $.ajax either
  this.lib = theLib;

  // This one will invoke "api/v1/user"
  this.getAllUser = function () {
     return lib.getAll();
  }
}

如何在

下测试这些功能
it('should return all user', function () {
   // How can I mock the returned data without using $http
   userService.getAllUser();
})

如果它使用$ http或$ ajax代替我可以很容易,我可以模拟使用$httpBackend或模拟ajax的返回。还有另一种模仿theLib的方法,但它里面有很多方法,但我不认为这是个好主意。在这种情况下有任何建议吗?

1 个答案:

答案 0 :(得分:0)

在Jasmine 2.0中,引入了一个用于测试ajax的新API。

Here

的链接

你可以做这样的事情,在每次测试之前设置stib ajax并在每次测试之后将其卸载,你可以参考上面的链接获取更多信息

beforeEach(function() {
  jasmine.Ajax.install();
  jasmine.Ajax.stubRequest('YOUR_URL_HERE').andReturn({
    responseText: 'YOUR_RAW_STUBBED_DATA_HERE'
  });
});

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

it('My Ajax Test', function() {
 // . . . code that makes an ajax request . . .
})

对于XHR请求,您可以尝试这样的

beforeEach(function() {
 // spyOn(XMLHttpRequest.prototype, 'open').andCallThrough(); // Jasmine 1.x
  spyOn(XMLHttpRequest.prototype, 'open').and.callThrough(); // Jasmine 2.x
  spyOn(XMLHttpRequest.prototype, 'send');
});

 it("should return all user", function() {
    userService.getAllUser();
    expect(XMLHttpRequest.prototype.open).toHaveBeenCalled();
  });