11
$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 我有以下内容,这会创建动态查询字符串。主要是“开始”参数和 whenGET 部分,我试图根据“开始”提供动态内容

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

4

3 回答 3

23

(适用于版本低于 v1.5.0-build.4371 的 Angular 应用程序)

如果您不关心“?”之后的参数 你可以这样做 :

$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, '{}');
于 2015-08-14T09:48:55.203 回答
13

编辑

v1.5.0-build.4371 开始,文档声明响应回调接受一个params参数。

默认情况下,请求 URL 上的查询参数被解析为 params 对象。因此 /list?q=searchstr&orderby=-name 的请求 URL 会将参数设置为 {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. 文档状态.respond()可以接受一个或Array一个回调函数,带有签名:function(method, url, data, headers) {};

现在我们知道如何访问请求 url,为了提供动态内容,我们可以简单地.respond()使用帮助函数解析我们在回调中收到的 url,例如Andy E在这个问题中发布的那个:

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

瞧!您可以为您的测试提供动态模拟数据。

于 2015-11-04T19:04:34.043 回答
3

论据

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

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

是不同的。他们应该是一样的。

于 2015-08-14T07:10:31.713 回答