Javascript 如何从angular';s$httpBackend?

Javascript 如何从angular';s$httpBackend?,javascript,angularjs,angular-mock,Javascript,Angularjs,Angular Mock,我正在尝试在angular中设置e2e测试套件,需要使用$httpBackend返回固定响应。如果我能返回一个文件内容就好了,例如 $httpBackend.whenPOST('/phones').respond(function(method, url, data) { return getContentOf("/somefile"); }); 我尝试使用$http,类似于 $httpBackend.whenPOST('/phones').respond(function

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

$httpBackend.whenPost返回requestHandler对象

根据官方文件:

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

  • 响应–
    {function([status,]data[,headers,statusText])| function(function(方法,url,数据,headers)}

    –respond方法获取一组要返回的静态数据,或者获取一个函数,该函数可以返回一个数组,其中包含响应状态(数字)、响应数据(字符串)、响应头(对象)和状态文本(字符串)
资料来源:

respond方法获取一组要返回的静态数据,或者获取一个函数,该函数可以返回包含响应状态(number)、响应数据(string)和响应头(Object)的数组

所以,你必须这样做:

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

由于$httpBackend无法处理返回的承诺,因此可以采用同步方式获取数据。$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, {}];
});

我的问题与我解决的问题相同:

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

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

Duh.是的,我知道了。我的问题是如何检索文件内容。我认为你不能按需检索。为什么你需要获取文件内容?你不能用一个假对象来模拟它吗?如果你真的必须拥有somefile.js的内容,我会使用karma p重新处理并使用文件内容。我可以,但有些响应相当大,所以我宁愿只在需要时才包含它。有些应用程序需要比{foo:“bar”}更多的数据工作..更多。@STEVER我最终使用了拦截器,http后端对我不起作用。我写了一篇博文@Inclusible!我花了一整天的时间试图用$http来检索我的数据文件,如果不是这样的话,我可能会放弃。谢谢@dc-。这是迄今为止最好的解决方案。请注意karma使用“b”ase'作为前缀或使用代理配置来避免。建议首先使用完整路径(如“”)通过测试seesion来验证文件是否正确承载。还请确保在karma配置中添加json文件以承载“ServeFile:['src/jspm_packages/***.'、'src/app/***.ts'、'src/app/***/.html'、'src/typings/***/.ts'、'src/app/***/.json'”取决于代码的位置。如果XMLHttpRequest在主线程上,您将收到一条关于对最终用户体验有害影响的警告。您知道为什么这样做吗?
$httpBackend
没有处理
异步
调用,对吗?这帮助了我: