如何模拟get(id)请求

时间:2014-03-20 16:12:52

标签: 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(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参数始终未定义。有什么想法实现我的目标吗?

2 个答案:

答案 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]];
    }
});