加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 如何模拟get(id)请求

发布时间:2020-12-17 17:53:09 所属栏目:安全 来源:网络整理
导读:我正在构建一个应用程序原型并尝试模拟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
我正在构建一个应用程序原型并尝试模拟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参数始终未定义.有什么想法实现我的目标?

解决方法

通过使用新函数(url),您的应用程序尝试从您的匿名函数实例化一个新对象,并将该新对象作为$httpBackend.whenGET()调用的第一个参数传递.
当然,在调用whenGET()时没有提供URL,因此它总是未定义的.

您应该传递函数本身(而不是使用该函数实例化的对象).例如.:

$httpBackend.whenGET(function (url) {
  ...
}).respond(users[id]);

更新:
经过一番挖掘后发现,在版本1.3.0-beta.3中添加了将函数作为第一个参数传递给whenGET的选项.您正在阅读的文档可能是指最新的测试版,而您使用的是早期版本.
(请注意,即使版本1.3.0-beta.1和2也没有提供此选项.)

没有详细说明,负责验证匹配的URL是MockHttpExpectation的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;
  };

行if(angular.isFunction(url))返回url(u);是一个提供直接传递函数的选项,并在版本1.3.0-beta.3中添加(如上所述).
但是,如果您仍想将函数传递给之前的AngularJS版本,则可以通过为对象提供测试方法来“欺骗”角度,使其相信您传递了RegExp.
即更换:

.whenGET(function (url) {...})

有:

.whenGET({test: function (url) {...}})

另见这short demo.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读