$httpBackend 带有查询参数的请求
$httpBackend with request with query param
$httpBackend.whenGET('/restpath/api/v1/books')
.respond({// some data});
我收到以下错误
Error: Unexpected request: GET /restpath/api/v1/books
Expected GET /restpath/api/v1/books?limit=10&start=1
对于 expectGET,我有以下内容,这会创建动态查询字符串。主要是 'start' 参数和 whenGET 部分,我正在尝试根据 'start'
提供动态内容
$httpBackend.expectGET('/restpath/api/v1/books?limit=10&start=1');
// the actual service goes here , which does the $http service. we don't care
$httpBackend.flush();
的参数
whenGET('/restpath/api/v1/')
和
expectGET('restpath/api/v1/books?limit=10&start=1')
不同。他们应该是一样的。
(对于 angular 版本低于 v1.5.0-build.4371 的应用)
如果您不关心 '?' 后面的参数你可以这样做:
$httpBackend.expectGET(/.*?restpath\/api\/v1\/books?.*/g).respond(200, '{}');
如果您关心第一个参数,请执行此操作:
$httpBackend.expectGET(/.*?restpath\/api\/v1\/books?limit=10.*/g).respond(200, '{}');
如果你关心他们都这样做:
$httpBackend.expectGET("/restpath/api/v1/books?limit=10&start=1").respond(200, '{}');
编辑
从 v1.5.0-build.4371 开始,文档声明响应回调接受 params
参数。
By default, query parameters on request URLs are parsed into the
params object. So a request URL of /list?q=searchstr&orderby=-name
would set params to be {q: 'searchstr', orderby: '-name'}
所以 '/restpath/api/v1/books?limit=10&start=1'
你会得到:
$httpBackend
.whenGET('/restpath/api/v1/books?limit=10&start=1')
.respond(function(method, url, data, headers, params) {
// params will be {
// limit: 10,
// start: 1
// }
});
上一个
你用
.expectGET()
如果你想让 $httpBackend 在不匹配时抛出异常。
.whenGET()
其他情况
docs 声明 .respond()
可以接受 Array
或
回调函数,签名为:function(method, url, data, headers) {};
现在我们知道如何访问请求 url,为了提供动态内容,我们可以简单地解析我们在 .respond()
回调中收到的 url 使用辅助函数,例如 Andy E in this question:
发布的那个
// inspired by Andy E
// @https://whosebug.com/users/94197/andy-e
function matchParams(query) {
var match;
var params = {};
// replace addition symbol with a space
var pl = /\+/g;
// delimit params
var search = /([^&=]+)=?([^&]*)/g;
var decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); };
while (match = search.exec(query))
params[decode(match[1])] = decode(match[2]);
return params;
}
在我们的范围内有了这个助手,我们就可以知道构建动态响应,例如:
// we use a regex to be able to still respond to
// dynamic parameters in your request
var urlRegex = /\/restpath\/api\/v1\/books\?limit=(\d+)&start=(\d+)/;
$httpBackend
.whenGET(urlRegex)
.respond(function(method, url){
// send only the url parameters to the helper
var params = matchParams(url.split('?')[1]);
// params is now an object containing
// {limit: 10, start:1}
// so do whatever you want with it.
var dynamicData = getMockData(params.start);
// don't forget to return.
return [200, dynamicData];
});
mySuperFactory.method().then(...);
// now resolve the Promise by flushing.
$httpBackend.flush();
瞧!您可以为您的测试提供动态模拟数据。
$httpBackend.whenGET('/restpath/api/v1/books')
.respond({// some data});
我收到以下错误
Error: Unexpected request: GET /restpath/api/v1/books
Expected GET /restpath/api/v1/books?limit=10&start=1
对于 expectGET,我有以下内容,这会创建动态查询字符串。主要是 'start' 参数和 whenGET 部分,我正在尝试根据 'start'
提供动态内容$httpBackend.expectGET('/restpath/api/v1/books?limit=10&start=1');
// the actual service goes here , which does the $http service. we don't care
$httpBackend.flush();
whenGET('/restpath/api/v1/')
和
expectGET('restpath/api/v1/books?limit=10&start=1')
不同。他们应该是一样的。
(对于 angular 版本低于 v1.5.0-build.4371 的应用)
如果您不关心 '?' 后面的参数你可以这样做:
$httpBackend.expectGET(/.*?restpath\/api\/v1\/books?.*/g).respond(200, '{}');
如果您关心第一个参数,请执行此操作:
$httpBackend.expectGET(/.*?restpath\/api\/v1\/books?limit=10.*/g).respond(200, '{}');
如果你关心他们都这样做:
$httpBackend.expectGET("/restpath/api/v1/books?limit=10&start=1").respond(200, '{}');
编辑
从 v1.5.0-build.4371 开始,文档声明响应回调接受 params
参数。
By default, query parameters on request URLs are parsed into the params object. So a request URL of /list?q=searchstr&orderby=-name would set params to be {q: 'searchstr', orderby: '-name'}
所以 '/restpath/api/v1/books?limit=10&start=1'
你会得到:
$httpBackend
.whenGET('/restpath/api/v1/books?limit=10&start=1')
.respond(function(method, url, data, headers, params) {
// params will be {
// limit: 10,
// start: 1
// }
});
上一个
你用
.expectGET()
如果你想让 $httpBackend 在不匹配时抛出异常。.whenGET()
其他情况
docs 声明
.respond()
可以接受Array
或 回调函数,签名为:function(method, url, data, headers) {};
现在我们知道如何访问请求 url,为了提供动态内容,我们可以简单地解析我们在 .respond()
回调中收到的 url 使用辅助函数,例如 Andy E in this question:
// inspired by Andy E
// @https://whosebug.com/users/94197/andy-e
function matchParams(query) {
var match;
var params = {};
// replace addition symbol with a space
var pl = /\+/g;
// delimit params
var search = /([^&=]+)=?([^&]*)/g;
var decode = function (s) { return decodeURIComponent(s.replace(pl, " ")); };
while (match = search.exec(query))
params[decode(match[1])] = decode(match[2]);
return params;
}
在我们的范围内有了这个助手,我们就可以知道构建动态响应,例如:
// we use a regex to be able to still respond to
// dynamic parameters in your request
var urlRegex = /\/restpath\/api\/v1\/books\?limit=(\d+)&start=(\d+)/;
$httpBackend
.whenGET(urlRegex)
.respond(function(method, url){
// send only the url parameters to the helper
var params = matchParams(url.split('?')[1]);
// params is now an object containing
// {limit: 10, start:1}
// so do whatever you want with it.
var dynamicData = getMockData(params.start);
// don't forget to return.
return [200, dynamicData];
});
mySuperFactory.method().then(...);
// now resolve the Promise by flushing.
$httpBackend.flush();
瞧!您可以为您的测试提供动态模拟数据。