Жасмин ждет приватной функции, которая выполняет асинхронный вызов для разрешения обещания - PullRequest
0 голосов
/ 11 июня 2019

У меня есть функция A, которая является частной функцией внутри контроллера.Функция A используется только один раз внутри моего контроллера:

$scope.$on('callA', function () {
    A();
});

Внутри A(), есть сервисный вызов, который выполняет операцию:

this.aPromise = myService.AsyncTask(var1, var2);
this.aPromise.promise.then(function (response) {
   ...
   $scope.$applyAsync(function() {
      ...
   });
}

Вот что я пробовал до сих пор:

it('should perform task A', function () {
   var promise;
   promise = $q.$resolve();
   spyOn(myService, 'AsyncTask').and.returnValue(promise);

   $rootScope.$broadcast('callA'); // call the function
});

Однако я получаю следующую ошибку: TypeError: Невозможно прочитать свойство 'then' из неопределенного .Я проследил его до следующей строки: this.aPromise.promise.then(function (response) {

Я пытаюсь проверить ... строк кода.Как я могу убедиться, что Жасмин ждет выполнения обещания, прежде чем запустить мой expect()?

1 Ответ

0 голосов
/ 11 июня 2019

Вы должны попробовать использовать $q.defer() вместо $q.$resolve()

it('should perform task A', function (done) { // use the done argument
   var mockResponse = {msg: "Success"};
   var defer = $q.defer();

   spyOn(myService, 'AsyncTask').and.returnValue(defer);

   $rootScope.$broadcast('callA'); // call the function

   $rootScope.$apply(function(){
       defer.resolve(mockResponse); // manually resolve the promise
   });

   defer.promise.then(function(response){
       expect(response.msg).toEqual(mockResponse.msg);

       done(); // Don't forget to invoke done. It tell Jasmine we've finished
   });

   // Propagate promise resolution to 'then' functions using $apply().
   $rootScope.$apply();
});

Сначала передайте аргумент done в ваш тест, он используется для асинхронных тестов.Используя $q.defer(), вы можете контролировать, когда resolve Promise.Поместите expect внутрь .then, если вам нужно проверить результат своего обещания.Я добавил пример с использованием переменной mockResponse, но он будет работать только в том случае, если в вашем коде this.aPromise.promise.then(function (response) {... в конце вашей функции вы вернете response.

Кроме того, нене забудьте вызвать done, он сообщает Jasmine, что мы с ним покончили.

И самое главное, вызовите $rootScope.$apply(); в конце, чтобы распространить разрешение обещания на .then функции.

Надеюсь, это поможет

...