Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/377.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
Javascript 带角度承诺的Jasmine测试不使用TypeScript解析_Javascript_Angularjs_Typescript_Jasmine_Angular Promise - Fatal编程技术网

Javascript 带角度承诺的Jasmine测试不使用TypeScript解析

Javascript 带角度承诺的Jasmine测试不使用TypeScript解析,javascript,angularjs,typescript,jasmine,angular-promise,Javascript,Angularjs,Typescript,Jasmine,Angular Promise,我有一个相当简单的测试,它针对一个角度承诺工作,我在beforeach函数中解决了这个问题,但是我的代码中的then永远不会触发,我看不到我缺少了什么。这些都是用TypeScript编写的,但这与问题没有任何关系 这是我的测验 describe('Refresh->', () => { var controller = new Directives.Reporting.ReportDirectiveController($scope, $q, $location); var

我有一个相当简单的测试,它针对一个角度承诺工作,我在beforeach函数中解决了这个问题,但是我的代码中的then永远不会触发,我看不到我缺少了什么。这些都是用TypeScript编写的,但这与问题没有任何关系

这是我的测验

describe('Refresh->', () => {

  var controller = new Directives.Reporting.ReportDirectiveController($scope, $q, $location);
  var called = false;
  var defer: any;

  beforeEach((done) => {
    controller.drillReport = (drillReport: Models.drillReport): ng.IPromise<Models.drillData> => {
      defer = $q.defer();
      called = true;
      defer.resolve({});
      return defer.promise;
    };
    spyOn(controller, 'processResults');
    controller.refresh();
    done();
  });

  it('Calls DrillReport', () => {
    expect(called).toBeTruthy();
  });

  it('Calls ProcessResults', () => {
    expect(controller.processResults).toHaveBeenCalled();
  });
});

您缺少的是,您需要访问才能使用
$scope
$rootScope
,以便可以调用并强制执行摘要循环

$scope.$digest();

需要这样做的原因是在摘要循环中处理已解决和已拒绝的承诺。因此,当您在模拟中解析承诺时,不会调用实际的承诺回调。

按照@Brocco所说的,您的代码在处理承诺之前调用done()

您所需要的是一种让测试代码知道已调用
parent.processResults()
的方法


我建议您让refresh返回一个承诺,该承诺将在
parent.processResults()
之后立即解决,并添加
controller.refresh()。最后(()=>{done();})在您的测试代码中。

谢谢。我知道,但已经忘记了。
$scope.$digest();