在控制器构造函数中调用时,Jasmine 模拟承诺解决未被处理

Jasmine mock promise resolve not being handled when called in controller construtor

在我的控制器构造函数中,许多私有变量被设置为来自服务的承诺 return 的结果。

例如controller构建时调用

MyService
    .initializeDataForType(type)
    .then(function (data) {
        //never getting hit when testing
    });

并且服务调用被模拟为 return 像这样已解决的承诺。

var myService = jasmine.createSpyObj('page.MyService', [
    'initializeDataForType'
]);

beforeEach(inject(function ($controller, _$q_) {
    myService.initializeDataForType.and.callFake(function (type) {
        var deferred = _$q_.defer();
        deferred.resolve({});
        return deferred.promise;
    });

    target = $controller('page.MyController', {
        'page.MyService': myService 
    });
}));

从未到达服务调用的 then() 方法。看来jasmine并没有等到下一个测试。

您是否尝试在实例化控制器后添加 $scope.$digest()?在 jasmine 测试中,您必须强制范围摘要循环,并且由于您的变量是作为承诺的结果设置的,因此在测试这些变量是否存在之前,摘要循环需要 运行。