Angular中的Karma测试没有达到预期的效果

时间:2014-02-16 16:34:11

标签: angularjs karma-runner

我的登录控制器是:

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);
      }
    });
  };
}]);

我的测试是:

  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: 'test@email.com',
        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});
    });
  });

在我看来,我有ng-init="init()"。一切都在前端顺利进行,但在进行测试时,我得到了:

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)

不确定我的测试做错了什么。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

是的,您需要先定义toEqualData,例如,Angular tutorial的方式:

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

答案 1 :(得分:2)

结果显示该行:expect(scope.status_object).toEqualData({text: 'Invalid User', class: 'danger', show: true});导致错误。没有toEqualData,所以我正在使用toEqual而现在正在使用