Shamoon
Shamoon

Reputation: 43639

Karma test in Angular isn't doing what it is expected to

My login controller is:

angular.module('mean').controller('LoginController', ['$scope', '$location', '$rootScope', 'UserService', function ($scope, $location, $rootScope, UserService) {
  $scope.init = function() {
    $scope.credentials = {};
    $scope.status_object = {
      text: '',
      class: '',
      show: false
    };    
  }

  $scope.authenticate = function() {
    $scope.status_object = {
      text: 'Authenticating...',
      class: 'info',
      show: true
    };
    UserService.authenticate($scope.credentials).then(function(response) {
      if(response.data.status === 'error') {
        $scope.status_object = {
          text: response.data.error,
          class: 'danger',
          show: true
        };
      } else if(response.data.status === 'ok') {
        $rootScope.globals.logged_in = true;
        $location.path('/' + response.data.user.access);
      }
    });
  };
}]);

My test is:

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

    var scope, rootScope, LoginController, $httpBackend, $location;

    beforeEach(inject(function($controller, $rootScope, _$httpBackend_, _$location_) {
      scope = $rootScope.$new();
      rootScope = $rootScope.$new();

      LoginController = $controller('LoginController', {
        $scope: scope,
        $rootScope: rootScope
      });

      $httpBackend = _$httpBackend_;

      $location = _$location_;
    }));

    it('should show danger when wrong credentials are used', function() {
      scope.credentials = {
        email: '[email protected]',
        password: 'password'
      }

      $httpBackend.expectPOST('/api/v1/user/auth').respond({
        status: 'error',
        error: 'Invalid User'
      });

      console.log(scope.status_object);
      scope.authenticate();
      $httpBackend.flush();


      expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true});
    });
  });

In my view, I have an ng-init="init()". Everything works smoothly on the front end, but when running my test, I get:

PhantomJS 1.9.7 (Mac OS X) LoginController should show danger when wrong credentials are used FAILED
  TypeError: 'undefined' is not a function (evaluating 'expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true})')
      at /myapp/test/karma/unit/controllers/login.spec.js:43
PhantomJS 1.9.7 (Mac OS X): Executed 4 of 4 (1 FAILED) (0.135 secs / 0.043 secs)

Not sure what my test is doing wrong. Any ideas?

Upvotes: 0

Views: 818

Answers (2)

Sergei Krupenin
Sergei Krupenin

Reputation: 459

Yes, you need to define toEqualData first, for example, the way the Angular tutorial does it:

  beforeEach(function(){
    this.addMatchers({
      toEqualData: function(expected) {
        return angular.equals(this.actual, expected);
      }
    });
  });

Upvotes: 4

Shamoon
Shamoon

Reputation: 43639

Turns out the line: expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true}); was causing the error. There is no toEqualData, so I'm using toEqual instead and it's working now

Upvotes: 2

Related Questions