3

我不想让 $http 被嘲笑。主要原因是我正在编写一些集成测试,所以我希望执行所有 AJAX 请求。目前在我的测试中没有一个被触发。任何建议都非常受欢迎。

4

2 回答 2

0

当您使用 Jasmine 测试时,角度模拟提供了模拟的 $httpBackend,但实际的 $httpBackend 仍然存在。您只需要在注入服务时告诉提供者使用原始的。在您的测试中它看起来像这样:

var original_http_backend = null; 
angular.module('ng').config(['$httpBackendProvider', function($httpBackendProvider) {
     original_http_backend = $httpBackendProvider;
}]);

beforeEach(module(function($provide) {
     $provide.provider('$httpBackend', original_http_backend)
}));

还值得指出的是,这种方法通常是测试前端代码的一种不好的方法。这是因为它添加了后端依赖,因此您无法隔离前端行为。最好模拟响应并用它进行测试。

不过我最终还是使用了这个功能,因为我们的模拟响应是在后端开发的以便在那里进行测试,而且我不想重复这些对象。这种方法允许我使用它们。

于 2014-01-21T17:54:52.800 回答
0

如果你真的需要测试异步操作,那么你可以使用Jasmine Async Support。它基本上包括创建runs()与旁边的块waitsFor。一个简单的例子:

var $http, returned;

it('should evaluate real XHR request', function() {
  // this will probably reside in your controller
  $http.$get('/foo.json').success(function(data) { returned = data; });

  waitsFor(function() {
    return !!returned;
  }, 'The $http didnt resolved in 1 second', 1000);

  runs(function() {
    expect(returned).toBe('The value you expect to be returned');
  });
});

每个runs块都将按照指定的顺序运行,当一个waitsFor发生时,runs 块将等到前一个waitsFor解析true运行。

于 2013-05-06T14:36:20.110 回答