Angularjs 如何模拟get(id)请求
我正在构建一个应用程序原型,并尝试模拟REST web服务 这是我的密码:Angularjs 如何模拟get(id)请求,angularjs,angularjs-e2e,Angularjs,Angularjs E2e,我正在构建一个应用程序原型,并尝试模拟REST web服务 这是我的密码: var mock = angular.module('mock', ['ngMockE2E']); mock.run(function($httpBackend){ users = [{id:1,name:'John'},{id:2,name:'Jack'}]; $httpBackend.whenGET('/users').respond(users); $httpBackend.whenGET(
var mock = angular.module('mock', ['ngMockE2E']);
mock.run(function($httpBackend){
users = [{id:1,name:'John'},{id:2,name:'Jack'}];
$httpBackend.whenGET('/users').respond(users);
$httpBackend.whenGET(new RegExp('\\/users\\/[0-9]+')).respond(users[0]);
}
一切正常,my resource User.query()返回所有用户,User.get({id:1})和User.get({id:2})返回同一个用户(John)
现在为了改进我的原型,我想返回合适的用户,匹配好的id
我读入我应该能够用函数替换RegExp URI。其思想是从url中提取id,以便在respond方法中使用它。
然后我试了一下:
$httpBackend.whenGET(new function(url){
alert(url);
var regexp = new RegExp('\\/users\\/([0-9]+)');
id = url.match(regexp)[1];
return regexp.test(url);
}).respond(users[id]);
问题是url参数始终未定义。有什么想法可以实现我的目标吗?通过使用
新函数(url)
你的应用程序尝试从匿名函数实例化一个新对象,并将该新对象作为$httpBackend.whenGET()
调用的第一个参数传递。当然,在调用
whenGET()
时,没有提供URL,因此它总是未定义的
您应该传递函数本身(而不是使用函数实例化的对象)。例如:
更新:
经过进一步挖掘,在版本1.3.0-beta.3中添加了将函数作为
whenGET
的第一个参数传递的选项。您正在阅读的文档可能指的是最新的测试版,而您使用的是早期版本。(请注意,即使版本1.3.0-beta.1和2也没有提供此选项。) 在不涉及太多细节的情况下,负责验证匹配URL的是
mockhttpexpection
的matchUrl
方法:
function MockHttpExpectation(method, url, data, headers) {
...
this.matchUrl = function(u) {
if (!url) return true;
if (angular.isFunction(url.test)) return url.test(u);
if (angular.isFunction(url)) return url(u); // <<<<< this line does the trick
return url == u;
};
与:
另请参见此我通过在响应部分中使用函数而不是when部分找到了解决方案:
$httpBackend.whenGET(new RegExp('\\/users\\/[0-9]+')).respond(
function(method, url){
var regexp = new RegExp('\\/users\\/([0-9]+)');
var mockId = url.match(regexp)[1];
return [200, users[mockId]];
}
});
如果我删除“new”关键字,警报将不再执行,我将得到“Error:Unexpected request:get/users/1”@Asterius:Aλ虽然您已设法解决了此问题,但请查看我的更新答案,以了解实际原因和可能的解决方案。好的,我现在了解错误,Il在阅读1.3文档时使用了1.2.24。感谢您的时间和演示!
.whenGET(function (url) {...})
.whenGET({test: function (url) {...}})
$httpBackend.whenGET(new RegExp('\\/users\\/[0-9]+')).respond(
function(method, url){
var regexp = new RegExp('\\/users\\/([0-9]+)');
var mockId = url.match(regexp)[1];
return [200, users[mockId]];
}
});