我不想让 $http 被嘲笑。主要原因是我正在编写一些集成测试,所以我希望执行所有 AJAX 请求。目前在我的测试中没有一个被触发。任何建议都非常受欢迎。
问问题
384 次
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 回答