在 AngularJS 中使用 jasmine 测试包含嵌套异步方法调用的异步服务方法

Testing async service method containing nested async method call with jasmine in AngularJS

提问人:Gellért Kovács 提问时间:11/29/2019 最后编辑:georgeawgGellért Kovács 更新时间:11/29/2019 访问量:365

问:

我正在尝试测试以下方法在其 promise 中返回的内容(并且都是在 angularJS 服务中定义的两种方法):functionToTestasyncGet

var functionToTest = function (param) {
  var deferred = $q.defer();

  asyncGet(param).then(function (result) {
    //business login involving result

    if (something) 
      return deferred.resolve(true);
    else
      return deferred.resolve(false);
  });

  return deferred.promise;
}

单元测试如下所示:

it ('should return true', function (done) {
  var asyncGetResult = {};
  spyOn(asyncGet).and.returnValue($q.resolve(asyncGetResult));  

  var param = {};
  functionToTest(param).then(function (result) {
     expect(result).toBe(true);
     done();
  }); 

  $scope.$apply();
});

运行测试时,我收到超时错误:

在指定的超时时间内未调用异步回调 茉莉花。DEFAULT_TIMEOUT_INTERVAL。

我尝试在 之后放置一个右键,但它没有打印任何内容,所以似乎从未执行过 的回调。console.log()expect()functionToTest(param).then()

任何帮助将不胜感激。

angularjs 异步 承诺 嵌套茉 莉花

评论


答:

0赞 georgeawg 11/29/2019 #1

删除 $q.deferred 反模式

var functionToTest = function (param) {

  ̶v̶a̶r̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶ ̶=̶ ̶$̶q̶.̶d̶e̶f̶e̶r̶(̶)̶;̶

  return asyncGet(param).then(function (result) {
    //business login involving result

    if (something) 
      return true;
    else
      return false;
  });

  ̶r̶e̶t̶u̶r̶n̶ ̶d̶e̶f̶e̶r̶r̶e̶d̶.̶p̶r̶o̶m̶i̶s̶e̶;̶

}

此外,请提供错误处理程序:

  functionToTest(param).then(function (result) {
     expect(result).toBe(true);
     done();
  }).catch(function(err) {
     console.log(err);
     done();
  });

如果代码编写错误,延迟反模式可能会挂起。避免使用反模式以防止此问题。

包括一个处理程序以查看任何错误。.catch

评论

0赞 Gellért Kovács 11/29/2019
谢谢你的建议!我从代码中删除了反模式,但不幸的是,测试仍然给出了超时。catch() 错误处理程序也不会被触发。