web-dev-qa-db-ja.com

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

11
Abhiram mishra

(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, '{}');
22
Arno_Geismar

[〜#〜]編集[〜#〜]

v1.5.0-build.4371 の時点で、ドキュメントには、応答コールバックがparams引数を受け入れると記載されています。

デフォルトでは、リクエストURLのクエリパラメータはparamsオブジェクトに解析されます。したがって、/ list?q = searchstr&orderby = -nameのリクエストURLは、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
    // }

   });
_

[〜#〜]前へ[〜#〜]

  1. あなたが使う

    • .expectGET() $ httpBackendを使用して、不一致時に例外をスローする場合。
    • その他の場合は.whenGET()
  2. docs は、.respond()が署名付きのArrayまたはコールバック関数のいずれかを受け入れることができると述べています:function(method, url, data, headers) {};

リクエストURLにアクセスする方法がわかったので、動的コンテンツを提供するために、 Andy Eによって投稿されたようなヘルパー関数を使用して、.respond()コールバックで受け取ったURLを簡単に解析できます。 この中 質問

_// 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();
_

そして出来上がり!動的なモックデータをテストに提供できます。

13
vilsbole

の引数

whenGET('/restpath/api/v1/')

そして

expectGET('restpath/api/v1/books?limit=10&start=1')

異なっています。それらは同じである必要があります。

3
atinder