2015-06-08 2 views
0

Я не могу понять, как правильно протестировать эту функцию. Nomatter, что $scope.registerFail равно true. Я уверен, что это потому, что вызов службы вызывается асинхронно, но я не уверен, как с этим справиться.Функция измерения единицы измерения

Heres моего блок тест

it('should fail', function(){ 
    $scope.registerForm={}; 
    $scope.registerForm.$valid = true; 
    $scope.registerFail = true; 
    $scope.register(); 
    expect($scope.registerFail).toEqual(false); 
}); 

И это моя функция:

$scope.register = function() { 
    var vm = this; 
    if (vm.registerForm.$valid) { 

     var names = vm.user.fullName.split(' '), 
      first_name = names[0], 
      last_name = '', 
      payload; 

     //Parse full name into first and last name 
     if (names.length > 1) { 
      first_name = vm.user.fullName.substr(0, vm.user.fullName.length - names[names.length - 1].length - 1); 
      last_name = names[names.length - 1]; 
     } 

     payload = { 
      email: vm.user.email, 
      password: vm.user.password, 
      password_confirmation: vm.user.password_confirmation, 
      first_name: first_name, 
      last_name: last_name, 
      terms_and_conditions: vm.user.terms_and_conditions, 
      over_13: vm.user.over_13, 
      ens_weekly_updates: vm.user.ens_weekly_updates, 
      referrer_id: null 
     }; 

     serverAuthenticationService.registerUser(payload).then(function(response){ 
      $scope.registerFail = false; 
      $modalInstance.close(); 
      $state.go('business-profile.details'); 
     }, function (reason) { 
      $scope.registerFail = true; 
      angular.forEach(reason.data.errors, function (error) { 
       error.field = error.field.substring(0, 1).toUpperCase() + error.field.substring(1); 
       $scope.registerErrors = error.field + ' ' + error.info + '.'; 
      }); 
     }); 
    } 
}; 
+0

Из моего чтения мне кажется, что мне нужно имитировать вызов службы, а на самом деле не делать этого. – Luca

+2

Правильно. Вам придется издеваться над этим, чтобы вернуть объект обещания, а не фактически запустить службу. Когда вы тестируете единицу кода, все внешние зависимости должны быть издеваются. –

+0

Не могли бы вы привести пример того, как это сделать? – Luca

ответ

1

Попробуйте это: -

it('should fail', function(){ 
    spyOn(serverAuthenticationService, 'registerUser').and.returnValue($q.when(false)); 
    $scope.registerForm={}; 
    $scope.registerForm.$valid = true; 
    $scope.registerFail = true; 
    $scope.register(); 
    $scope.$apply(); // Forces $q.promise then callbacks to be called 
    expect($scope.registerFail).toEqual(false); 
}); 

Read here для аналогичного SO ответа для подробного объяснения.

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