gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:01:32 27 4
gpt4 key购买 nike

我正在构建一个应用程序原型(prototype)并尝试模拟 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)。

现在为了改进我的原型(prototype),我想返回合适的用户,匹配好的 id。

我在 the angular documentation 中阅读我应该能够用一个函数替换 RegExp URI。这个想法是从 url 中提取 id 以在响应方法中使用它。
然后我尝试了这个:
$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 参数始终未定义。有什么想法可以实现我的目标吗?

最佳答案

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

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

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

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

无需赘述,负责验证匹配 URL 的是 MockHttpExpectationmatchUrl方法:
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)) return url(u);是提供直接传递函数选项的选项,并在 1.3.0-beta.3 版本中添加(如前所述)。
但是,如果您仍想将函数传递给以前的 AngularJS 版本,您可以通过提供带有 test 的对象来“欺骗” angular 以相信您传递了 RegExp。方法。
IE。代替:
.whenGET(function (url) {...})

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

另见 short demo .

关于angularjs - 如何模拟 get(id) 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22538890/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com