2016-01-18 5 views
1

Я пытаюсь проверить мой контроллер входа, который должен отправить логин/пароль пользователей в службу и сказать, существует ли он в службе. Вот мой код:angularjs jasmine обещание тестирование

describe('LoginController', function() { 
    beforeEach(module('task6')); 

    var $controller, LoginService; 

    beforeEach(inject(function(_$controller_, _LoginService_) { 
     $controller = _$controller_; 
     LoginService = _LoginService_; 
    })); 

    describe('LoginController.submitLogin', function() { 
     it('tests if such user exists', function() { 
      var $scope = {}; 
      var controller = $controller('LoginController', 
             {$scope: $scope}); 
      controller.loginField = 'John'; 
      controller.password = 'Smith'; 
      LoginService.signIn(controller.loginField, 
           controller.password) 
      .then(function(logged) { 
       expect(true).toBe(false); 
      }); 
     }); 
    }); 
}); 

Но, похоже, тесты в функции «.then» никогда не выполнялись. Он проходит все тесты даже при этих условиях.

+0

вы пытались прочитать официальную документацию - https: //docs.angularjs. org/api/ng/service/$ q # тестирование? Чем вы можете попытаться прочитать какую-нибудь статью, например: http://brianmcd.com/2014/03/27/a-tip-for-angular-unit-tests-with-promises.html –

+0

Йо, вы можете проверить эту статью (написано мной) https://ath3nd.wordpress.com/2013/08/05/15/. Конечно, это ретранслятор специфический, но restangular - это сервис, который использует обещания, поэтому он должен быть близок к тому, чего вы хотите достичь. Кроме того, вы можете взглянуть на это: http://stackoverflow.com/questions/33367354/karma-jasmine-how-to-properly-spy-on-a-modal/33367678#33367678 –

ответ

1

Это происходит потому, что ваш тестируют асинхронный код так, что вам нужно сделать тест асинхронно сделано следующим образом ...

it('tests if such user exists', function(done) { 
      ..... 
      LoginService.signIn(controller.loginField, 
          controller.password) 
      .then(function(logged) { 
       expect(true).toBe(false); 
       // done(); 
      }).catch(function(failure) { 
       expect(true).toBe(true); 
       done(); 
      }) 

     }); 
    }); 

сделано делает его ждать обещание разрешить/отклонить. , если он не разрешает или отклоняет в течение 2 секунд (по умолчанию), тогда тест завершится с ошибкой.

+0

Спасибо! Но почему-то это не работает для меня. Я уверен, что я делаю то же самое, что и я все еще получаю сообщение «Успех» на всех тестах ... 'LoginService.signIn (controller.loginField, \t \t \t \t \t \t \t \t \t \t \t \t \t controller.password) \t \t \t .then (функция (вход) { \t \t \t \t ожидать (ложь) .toBe (истина); \t \t \t}) \t \t \t .catch (функция (отказ) { \t \t \t \t ожидать (истина) .toBe (ложь); \t \t \t \t done(); \t \t \t}); ' – Vovch

+0

ok ваш тестовый код предполагает, что LoginService.signIn возвращает обещание. Это верно? возможно, вы можете указать этот код – danday74

+0

PS вы добавили ... он («проверяет, существует ли такой пользователь», функция (сделано) ... также замечает, что сделано здесь - это то, что делает асинхронный тест - вызовы, сделанные в разрешение обещание просто обозначают тест асинхронной завершения – danday74

1
function signIn(username, password) { 
    /// THIS RETURNS A PROMISE BECAUSE $http returns a promise. Thus you can call THEN method on the return value because all promises have a THEN method. 
    return $http.post('myserver', {username:username, password:password}); 
} 



// Another approach using $q 

function signIn(username, password) { 
    var defer = $q.defer(); 
    if (username==="fred" && password==="mypass") { 
     defer.resolve("nice one"); 
    } else { 
     defer.reject("oh dear"); 
    } 
    return defer.promise; 
} 

Здесь оба подхода возвращают обещание. так что теперь, когда я вызываю функцию я могу вызвать ТОГДА на его возвращаемое значение (поскольку возвращаемое значение является обещание) ...

signIn("fred", "badpass").then(function(response) { 
    console.log(response); 
}).catch(function(failure) { 
    console.log(failure); 
}); 
Смежные вопросы