我正在构建应用程序原型并尝试模拟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(new RegExp('\\/users\\/[0-9]+')).respond(users[0]);
}
一切正常,我的资源User.query()返回所有用户,User.get({id:1})和User.get({id:2})返回相同的用户(John)。
现在为了改进我的原型,我想返回相应的用户,匹配好的id。
我在the angular documentation中读到我应该能够用函数替换RegExp URI。我们的想法是从url中提取id以在response方法中使用它。 然后我尝试了这个:
$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参数始终未定义。有什么想法实现我的目标吗?
答案 0 :(得分:6)
使用new function(url)
您的应用尝试从匿名函数中实例化一个新对象,并将该新对象作为$httpBackend.whenGET()
调用的第一个参数传递。
当然,在调用whenGET()
时没有提供URL,因此它总是未定义的。
您应该传递函数本身(而不是使用该函数实例化的对象)。 E.g:
$httpBackend.whenGET(function (url) {
...
}).respond(users[id]);
<强>更新强>
经过一番挖掘后发现,在{em> 1.3.0-beta.3 版本中添加了将函数作为第一个参数传递给whenGET
的选项。您正在阅读的文档可能是指最新的测试版,而您使用的是早期版本
(请注意,即使版本1.3.0-beta.1和2也未提供此选项。)
没有详细说明,负责验证匹配网址的是MockHttpExpectation
的{{1}}方法:
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;
};
是提供直接传递函数的选项,并在版本1.3.0-beta.3中添加(如上所述)。
但是,如果您仍想将函数传递给之前的AngularJS版本,则可以通过提供具有if (angular.isFunction(url)) return url(u);
方法的对象来“欺骗”角度,使其相信您通过了RegExp。
即替换:
test
使用:
.whenGET(function (url) {...})
另请参阅此 short demo 。
答案 1 :(得分:3)
我通过在响应部分使用函数而不是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]];
}
});