Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 如何模拟get(id)请求_Angularjs_Angularjs E2e - Fatal编程技术网

Angularjs 如何模拟get(id)请求

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(

我正在构建一个应用程序原型,并尝试模拟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]);
}
一切正常,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]];
    }
});