21

我正在尝试以角度设置 e2e 测试套件,并且需要使用 $httpBackend 返回预设响应。如果我可以只返回一个文件内容,那就太好了,例如

  $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
    return getContentOf("/somefile");
  });

我尝试使用 $http,类似于

  $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
    return $http.get("/responses/phones.js");
  });

但它没有用,猜测 angular 不支持从 $httpBackend 返回承诺?

我可以做到的一种方法是在应用程序加载时引用带有响应的 js 文件,并将文件的内容分配给变量,但是能够按需加载数据会更好。

4

3 回答 3

31

由于 $httpBackend 不适用于返回的 Promise,因此您可以这样做的一种方法是同步获取数据。$http 没有开箱即用的同步选项,因此您必须在没有它的情况下调用您的文件,如下所示:

$httpBackend.whenPOST('/phones').respond(function(method, url, data) {
  var request = new XMLHttpRequest();

  request.open('GET', '/responses/phones.js', false);
  request.send(null);

  return [request.status, request.response, {}];
});
于 2014-06-18T13:58:15.547 回答
6

我有同样的问题,我解决了:

$httpBackend.whenPOST("some/url").respond(function(method, url, data) { 
    return $resource("path/to/your/json/file.json").get(); 
});

这显然需要angular-resource模块才能工作。

于 2014-10-08T21:47:25.153 回答
0

$httpBackend.whenPost 返回一个 requestHandler 对象。

根据官方文档:

requestHandler(is) 具有respond控制如何处理匹配请求的方法的对象。

  • respond –<br /> –response {function([status,] data[, headers, statusText]) | function(function(method, url, data, headers)}
    方法接受一组要返回的静态数据或一个函数,该函数可以返回一个数组,其中包含响应状态(数字)、响应数据(字符串)、响应头(对象)和文本状态(字符串)。

来源: 角度文档

respond 方法接受一组要返回的静态数据或一个函数,该函数可以返回一个包含响应状态(数字)、响应数据(字符串)和响应头(对象)的数组。

所以,你必须做这样的事情:

var response = 'content of somefile.js';
// OR var response = { foo : "bar" };
// OR var response = (actually consume content of somefile.js and set to response)

$httpBackend.whenPost('/phones').respond(response); 
于 2014-01-11T02:02:25.353 回答