mercredi 27 janvier 2016

undefined $scope variable inside function in jasmine test

I recently started to learn unit test for angular apps. And already faced up with problem. I can not take scope variable from inside executed function. Here is my factory code

angular.module('app').factory('AuthenticationService', AuthenticationService);
  AuthenticationService.$inject = ['$http'];
  function AuthenticationService($http) {
    var service = {};

    service.login = login;
    return service;

    function login(data, callback) {
      $http({
        method: 'POST',
        url: CONFIG.getUrl('auth/login'),
        data: data
      }).then(function (response) {
          callback(response);
        }, function (error) {
          callback(error);
        });
    }

Part of my controller file. I only yet wan to test login function

function AuthCtrl($scope, $location, AuthenticationService) {
    var vm = this;
    vm.login = login;

    vm.dataLogin = {
      user_id: '',
      password: '',
    };
    function login() {
      vm.dataLoading = true;
        AuthenticationService.login(vm.dataLogin, function (response) {

          if (response.status == 200) {
            if (response.data.error_code == 'auth.credentials.invalid') {
              vm.invalidCredentials = true;
            } else {
              vm.invalidCredentials = false;
              if (response.data.session_state == 'otp_required') {
                vm.userNumber = response.data.user_phone;
                $localStorage['session_token'] = response.data.session_token;
                vm.needForm = 'someForm';
              } else {
                AuthenticationService.setCredentials(response.data);
                $state.go('dashboard');
              }
              vm.dataLoading = false;
            }
          }
        });
      }
    }
});

And my spec.js

describe('AuthCtrl, ', function() {
    var $scope, ctrl;
    var authSrvMock;


    var mockJson = {
      user_id: '001',
      session_token: 'some_token'
    };

    var mockLoginData = {
      user_id: '0000102',
      password: '123456'
    };

    var mockResponseData = {
      data: {
        "session_expires": 1453822506,
        "session_state": "otp_required",
        "session_token": "tokennnn",
        "status": "success",
        "user_id": "0000102",
        "user_phone": "+7 (XXX) XXX-XX-89"
      },
      status: 200
    };

    beforeEach(function () {

      authSrvMock = jasmine.createSpyObj('AuthenticationService', ['login', 'logout']);
      module('app');

      inject(function ($rootScope, $controller, $q) {
        $scope = $rootScope.$new();
        authSrvMock.login.and.returnValue(mockResponseData);
        ctrl = $controller('AuthCtrl', {
          $scope: $scope,
          AuthenticationService: authSrvMock
        });
      });
    });

    it('should call login function and pass to dashboard', function () {
      ctrl.login();
      expect(authSrvMock.login).toHaveBeenCalled();
      // until this everything works here just fine
    });

  });

But after I want to test vm.invalidCredentials, if I will write

expect(ctrl.invalidCredentials).toBe(false)

I will get the error Expected undefined to be false.

Why I can't see variables?

Aucun commentaire:

Enregistrer un commentaire