$ httpBackend с запросом с параметром запроса
$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();
Ответы
Ответ 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, '{}');
Ответ 2
ИЗМЕНИТЬ
По состоянию на v1.5.0-build.4371 документы указывают, что ответный ответ отвечает аргументом params
.
По умолчанию параметры запроса по URL-адресам запроса анализируются в params. Таким образом, URL-адрес запроса /list? Q = searchstr & orderby = -name установили бы params как {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-адресу запроса, чтобы обслуживать динамический контент, мы можем просто проанализировать URL-адрес, который мы получаем в обратном вызове .respond()
, используя вспомогательную функцию, такую как функция, отправленная Andy E в этом question:
// inspired by Andy E
// @https://stackoverflow.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();
И вуаля! Вы можете использовать динамические макетные данные для своих тестов.
Ответ 3
аргументы для
whenGET('/restpath/api/v1/')
и
expectGET('restpath/api/v1/books?limit=10&start=1')
разные. Они должны быть одинаковыми.