Javascript 如何从angular';s$httpBackend?
我正在尝试在angular中设置e2e测试套件,需要使用$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
$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方法获取一组要返回的静态数据,或者获取一个函数,该函数可以返回一个数组,其中包含响应状态(数字)、响应数据(字符串)、响应头(对象)和状态文本(字符串)
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
没有处理异步
调用,对吗?这帮助了我: