【问题标题】:How to return a file content from angular's $httpBackend?如何从 Angular 的 $httpBackend 返回文件内容?
【发布时间】:2014-10-09 05:47:25
【问题描述】:

我正在尝试以角度设置 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 文件,并将文件的内容分配给变量,但是能够按需加载数据会更好。

【问题讨论】:

标签: javascript angularjs angular-mock


【解决方案1】:

由于 $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, {}];
});

【讨论】:

  • 难以置信!我花了一整天的时间试图用 $http 来检索我的数据文件来解决这个问题,如果不是为了这个,我可能会放弃。谢谢@dc-。
  • 这是迄今为止最好的解决方案。请注意 karma 使用“base”作为前缀或使用代理配置来避免这一事实。作为建议,首先使用像“localhost:9876/base/src/app/modules/mock-data.json”这样的完整路径来验证文件是否被测试看见正确托管。还要确保在 karma 配置中添加 json 文件以托管' serveFiles: [ 'src/jspm_packages/**/*.*', 'src/app/**/*.ts', 'src/app/**/ *.html', 'src/typings/**/*.ts', 'src/app/**/*.json''
  • 取决于您拥有此代码的位置。如果 XMLHttpRequest 在主线程上,您将收到有关对最终用户体验产生不利影响的警告
【解决方案2】:

我遇到了同样的问题:

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

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

【讨论】:

  • 知道为什么会这样吗? $httpBackend 没有处理 asynchronous 电话,对吗?
【解决方案3】:

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

根据官方文档:

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

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

来源: Angular Documentations

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

所以,你必须这样做:

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); 

【讨论】:

  • 呃……是的,我明白了。我的问题是如何检索该文件内容。
  • 我认为您不能按需进行。为什么需要获取文件的内容?你不能用一个假物体来模拟它吗?如果你真的必须拥有 somefile.js 的内容,我会使用 karma 预处理器并使用文件内容。
  • 我可以,但是有些响应很大,所以我宁愿只在需要时才包含它。
  • 一些应用程序需要比 {foo:"bar"} 更多的数据才能工作.. 更多。
  • @STEVER 我最终使用了拦截器,http 后端对我不起作用。写了一篇博文@etcoding.com/blog/2014/01/20/…
猜你喜欢
  • 1970-01-01
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多