AngularJS 使用 $httpBackend 模拟响应

AngularJS mocking responses with $httpBackend

以下 HTTP 请求,被 ngMockE2E 模块拦截“$httpBackend,永远不会完成。从 $httpBackend 获得响应的正确方法是什么?

var app = angular.module('app', ['ngMockE2E']);

app.controller('Foo', function(MyHttpService, $scope) {
  MyHttpService.get().then(function(data) {
    $scope.async_data = data;
  });
});

app.factory('MyHttpService', function($http, $q) {
  return {
    get: function() {
      console.log('MyHttpService.get()');
      return $http.get('/test').then(function(data) {
        console.log('$http.get()', data);
        return data;
      });
    }
  }
});

app.run(['$httpBackend', function($httpBackend) {
  $httpBackend
    .whenGET(/^\/test/)
    .respond(function(method, path) {
       console.log(method, path);
       return {method: method, path: path};
    }); 
}]);

这是一个live example on codepen

它不起作用的原因是 .respond 中的回调没有 return 正确的数据,随后静默失败。 更改如下:

app.run(['$httpBackend', function($httpBackend) {
  $httpBackend
    .whenGET(/^\/test/)
    .respond(function(method, path) {
       console.log(method, path);
       return [200, {method: method, path: path}];
    }); 
}]);

Here a working codepen