2016-02-19 6 views
2

У меня довольно простой тест, который работает против углового обещания, которое я решаю в функции beforeEach, но тогда в моем коде не срабатывает, и я не могу посмотри, что мне не хватает. Они написаны с помощью TypeScript, но на самом деле это не влияет на проблему.Испытание жасмина с угловым обещанием, не разрешающим с помощью 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(); 
    }); 
}); 

Метод Refresh в контроллере выглядит следующим образом:

refresh() { 
    this.drillReport({ drillReport: drillReport }) 
    .then((results: Models.drillData) => { 
     parent.processResults(results, parent.availableDrills, this.columns, this.gridOptions, undefined, undefined); 
    }); 
} 

ответ

3

Что вам не хватает, что вы будете иметь доступ использовать $scope или $rootScope, так что вы можете позвонить и заставить цикл дайджеста ...

$scope.$digest(); 

Rea сыну нужно, чтобы разрешенные и отклоненные обещания обрабатывались во время цикла дайджеста. Поэтому, в то время как вы решаете обещание в своем макете, фактический вызов callback не вызывается.

+0

Спасибо. Я знал это, но забыл об этом. –

0

Следуя за тем, что сказал @Brocco, ваш код вызывает done() перед обработкой обещания.

Что вам нужно, чтобы ваш тестовый код знал, что вызвал parent.processResults().

Я предлагаю вам обновить возврат обещания, которое будет разрешено сразу после parent.processResults(), и добавьте controller.refresh().finally(() => { done(); }); в ваш тестовый код.

Смежные вопросы