0

Попытка выяснить, как проверяется метод вызова на впрыскиваемой службе.Тестирование вызова метода на впрыснутом сервисе

Служба (на базе завода): loginService.js

angular.module('loginService', []) 
    .factory('loginService', function (URLbase, $http, loginModel, $route, $location, logoutService, overviewService) { 
     return { 
      logMeIn: function (login) { 

       $http({ 
        method: 'POST', 
        url: URLbase + 'authentication/login', 
        data: {'Login': login.username, 'Password': login.password} 
       }).then(function (result) { 

         loginModel.set('passwordRequested', false); 
         loginModel.set('loginFailed', false); 
         loginModel.set('loginExpired', false); 
         loginModel.set('loginBlocked', false); 
         loginModel.set('loggedIn', false); 
         loginModel.set('sessionExpired', false); 
         loginModel.set('loggedIn', false); 
         loginModel.set('concurrentLogin', false); 
         loginModel.set('somethingWrong', false); 

         // Check login result by status code 
         var status = result.data.Response.Status.StatusCode, 
          data = result.data.Response.Payload; 

        switch (status) { 
         case 0: 
          loginModel.set('tokenToken', data.Token); 
          loginModel.set('tokenUserId', data.userId); 
          loginModel.set('userName', data.User.FirstName + ' ' + data.User.SurName); 
          loginModel.set('userFirstName', data.User.FirstName); 
          loginModel.set('userLastName', data.User.SurName); 
          loginModel.set('userEmailAddress', data.User.Email); 
          loginModel.set('userPhone', data.User.Phone); 
          loginModel.set('userPreferredLanguage', data.User.PreferredLanguage); 
          loginModel.set('loggedIn', true); 
     ...... 

Тест Блок

beforeEach(inject(function ($controller, _$rootScope_, _$httpBackend_, $injector, _loginService_, _loginModel_) { 
    loginService = _loginService_; 
    httpBackend = _$httpBackend_; 
    $rootScope = _$rootScope_; 
    loginModel = _loginModel_; 

    loginPost = {'Login': login.username, 'Password': login.password}; 
    httpBackend.whenPOST(URLbase + 'authentication/login', loginPost).respond(200, jsonObj); 
})); 

it('should get login data from the backend', function() { 

    spyOn(loginService, 'logMeIn').andCallThrough(); 
    loginService.logMeIn(login); 
    expect(loginService.logMeIn).toHaveBeenCalledWith(login); 
    httpBackend.flush(); 

    //spyOn(loginModel, 'set').andCallThrough(); 
    //loginService >> logMeIn >> loginModel.set('userLastName', 'Vijver'); 
    //metod >> toHaveBeenCalledWith('userLastName', 'Vijver'); 
}); 

Таким образом, в последние 3 строки комментария, я хочу, чтобы проверить, если loginModel.set('userFirstName', data.User.FirstName); вызывается с правильные параметры.

Как я могу управлять этим?

ответ

1

Вы можете проверить результат внутри самого вызова:

logService.logMeIn(login).then(function(result) { 
    expect(loginModel.set).toHaveBeenCalledWith('userFirstName',data.User.FirstName); 
}); 

EDIT

Ваша функция должна сделать это:

return { 
     logMeIn: function (login) { 

      return $http({.. 
     } 
} 

EDIT

I п касаемо оператор коммутатора я бы сделал это, как я хотел бы сохранить успех и части отказа как можно меньше:

$http({ 
    method: 'POST', 
    url: URLbase + 'authentication/login', 
    data: {'Login': login.username, 'Password': login.password} 
}).then(function (result) { 

    // This underscore is lodash syntax - which I'd recommend 
    var loginStuff = ['passwordRequested','loginFailed','loginExpired',etc]; 
    _.forEach(loginDetails, function(detail) { 
    loginModel.set(detail, false); 
    }); 
    // Here I have immediately removed lines of redundant code. 
    // I'd also suggest you go one further and place this into it's own  
    // function - which can be private to the service if you choose 
}); 

Этот же принцип может быть применен к коммутатору. Не видя всех ящиков коммутатора, я не могу его правильно реорганизовать.

+0

имеет смысл, реализовал его, но я получил ошибку 'TypeError: Can not read property 'then' of undefined' –

+0

@SanJayFalcon, потому что вы не возвращаете обещание. Измените функцию logMeIn(), чтобы вернуть ее. См. Мое редактирование – Katana24

+0

, это работает, но функция loginModel.set существует в определенном случае коммутатора. Я заставляю код работать через другой случай переключения теперь, который не содержит эту функцию, но все же тест преуспевает. 'loginModel.set', кажется, тестируется автономно, его нужно проверить как свойство на loginService? –

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