Angular - Jasmine可以真正执行XHR吗?

时间:2013-05-02 15:53:22

标签: angularjs jasmine

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

2 个答案:

答案 0 :(得分: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发生时,运行块将等到上一个waitsFor解析为true以运行。

答案 1 :(得分: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)
}));

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

我最终使用了这个功能,因为我们的模拟响应是在后端开发的,用于测试,我不想重复这些对象。这种方法允许我使用它们。