2015-04-13 4 views
0

С учетом этого испытания Коджасмин модульное тестирование угловой сервис, который возвращает обещание не решить

it('can login', inject(function ($httpBackend,$rootScope) { 
     // Set up the mock http service responses 
     authRequestHandler = $httpBackend.when('POST', '/login') 
      .respond({success: true, user: {email: '[email protected]', roles: ['user']}}); 
     var promise = dsAuth.authenticateUser('123', '123') 

     promise.then(function (success) { 
      console.log('Got login response'); 
      expect(success).toBe(true); 
      expect(dsIdentity.isAuthenticated()).toBe(true); 
      console.log(dsIdentity.currentUser); 
     }); 
     $rootScope.$digest(); //a solution found in on SO that doesn't work 
    })); 

Это обещание (которое получает вернулся из службы AUTH) никогда не решает? Как это можно зафиксировать? код в функции .then() никогда не вызывается

Service Code:

(function(angular) { 
angular.module('dsApp').factory('dsAuth', 
    ['$http','$q',dsAuth]); 
function dsAuth($http,$q) { 
    return { 
     authenticateUser: function(username,password) { 
      var dfd = $q.defer(); 
      $http.post('/login', {username: username, password: password}).then(function (resp) { 
       console.log($resp); 
       if (resp.data.success) { 
        var user = new atUser(); 
        angular.extend(user, resp.data.user); 
        atIdentity.currentUser = user; 
        dfd.resolve(true); 
       } else { 
        dfd.resolve(false); 
       } 
      }); 
      return dfd.promise; 
     }, 
     logoutUser: function() { 
      var dfd = $q.defer(); 
      $http.post('/logout', {logout: true}).then(function() { 
       atIdentity.currentUser = undefined; 
       dfd.resolve(); 
      }); 
      return dfd.promise; 
     } 
    }; 
} 

}) (this.angular);

ответ

0

Жасмин не работает с асинхронными ожиданиями. Решением этого является использование функции flush() от httpBackend.

it('can login', inject(function ($httpBackend,$rootScope) { 
     // Set up the mock http service responses 
     authRequestHandler = $httpBackend.when('POST', '/login') 
      .respond({success: true, user: {email: '[email protected]', roles: ['user']}}); 
     var promise = dsAuth.authenticateUser('123', '123') 
     var success = false; 

     promise.then(function (result) { 
      console.log('Got login response'); 
      success = result; 
      console.log(dsIdentity.currentUser); 
     }); 
     $httpBackend.flush(); 
     expect(success).toBe(true); 
     expect(dsIdentity.isAuthenticated()).toBe(true); 
    })); 

Я не совсем уверен, где dsIdentity приходит, но я полагаю, вы можете понять, что в вашем собственном коде. Шаблон тот же - создайте переменную за пределами закрытия, а затем установите значение внутри закрытия. flush() вызовет обещание стрелять, и тогда вам будет хорошо идти.

+0

Спасибо, что группа не понимала, что она не совместима с асинхронной – DavidMIRV

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