Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 使用带有Karma的Parse SDK测试angular服务的最佳解决方案_Angularjs_Parse Platform_Jasmine_Karma Jasmine - Fatal编程技术网

Angularjs 使用带有Karma的Parse SDK测试angular服务的最佳解决方案

Angularjs 使用带有Karma的Parse SDK测试angular服务的最佳解决方案,angularjs,parse-platform,jasmine,karma-jasmine,Angularjs,Parse Platform,Jasmine,Karma Jasmine,我正在尝试自动测试Angular服务,这些服务碰巧通过Parse SDK调用Parse.com 我遇到的问题是,除非我明确地触发一个摘要周期,否则承诺不会得到解决,而我的服务是以这种方式完成的,我必须在我的服务实现中这样做,这是不可持续的 我的服务代码如下: factory('myService', function($http, $q, $rootScope) { var myService = {}; myService.simplePromiseTest = function(

我正在尝试自动测试Angular服务,这些服务碰巧通过Parse SDK调用Parse.com

我遇到的问题是,除非我明确地触发一个摘要周期,否则承诺不会得到解决,而我的服务是以这种方式完成的,我必须在我的服务实现中这样做,这是不可持续的

我的服务代码如下:

factory('myService', function($http, $q, $rootScope) {

  var myService = {};

  myService.simplePromiseTest = function() {
    var p = $q.defer();
    var query = new Parse.Query("AnyObjectInParse");
    query.find().then(function(results){
      p.resolve(results);

      // *** I have to include that line for the jasmine test to run ***
      $rootScope.$apply();
    });     
    return p.promise;
  }
 }

 return myService;
}

这是我的茉莉花测试

async.it('should resolve the promise', function(done) {
  myService.simplePromiseTest().then(function(results) {
    // this is never called if don't trigger the digest from the service code
    done();
   });

   // This line is use less as when I get into that line, the promise is not resolved.
   // $scope.$root.$digest();
});
因此,情况如下:

factory('myService', function($http, $q, $rootScope) {

  var myService = {};

  myService.simplePromiseTest = function() {
    var p = $q.defer();
    var query = new Parse.Query("AnyObjectInParse");
    query.find().then(function(results){
      p.resolve(results);

      // *** I have to include that line for the jasmine test to run ***
      $rootScope.$apply();
    });     
    return p.promise;
  }
 }

 return myService;
  • 在触发摘要循环之前,我必须等待解析调用结束
  • 除了用这个代码污染我的服务代码之外,我找不到其他解决方案
  • 我想找到一个可持续的解决方案,它不需要我更新我的服务代码来通过测试

提前感谢,我对此感到困惑,我可能遗漏了一些明显的东西:-)

调用
$rootScope.$apply()在测试本身中,而不是在承诺实现中。完成
的测试是异步的,因此可以在以后解决它。或者使用角度1.3


一般来说,对于测试承诺,我可能会推荐mocha而不是Jasmine,因为它支持带有
return
语句的开箱即用的承诺测试

您好,Benjamin,看到注释行了吗?当我从测试内部调用$rootScope.$apply()时,它是在承诺得到解决之前调用的,因此没有任何效果。您使用的是Angulr的哪个版本?我实际上使用的是Ionic Framework,它似乎在我当前安装的版本中使用Angular 1.2。1.3在解决承诺方面是否应该表现出不同的行为?是的,确实如此。它不再需要
$apply