Подтвердить что ты не робот

$ 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();

4b9b3361

Ответ 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')

разные. Они должны быть одинаковыми.