AngularJS:带有重定向的单元测试页面

时间:2014-11-16 14:27:29

标签: angularjs unit-testing jasmine

您能否为以下Ctrl建议一些好的单元测试?

  1. 我想确保重定向正常工作
  2. 无论如何我可以在这里使用茉莉花间谍/任何好处吗?
  3. 是否可以测试控制器在强制重定向上的行为方式(重定向到重定向的页面)?
  4. angular.module('app')
      .controller('MainCtrl', ['$scope', 'API', '$location', function ($scope, API, $location) {
    
      // redirect back to login page
      if( ! API.token ) $location.path('/');
    
    
    }]);
    

1 个答案:

答案 0 :(得分:8)

单元测试应该只关注它正在测试的组件。您不应该测试$ location实际执行的操作,而是在需要时调用该方法。此外,您并不关心API服务的作用,当令牌为虚假时,控制器会调用位置方法。

我会:

模拟服务API

监视$location.path方法。

API.token设为true

检查是否未调用$location.path

API.token设为false

检查是否已使用参数“/".

调用$location.path

这样的事情:

describe('Controller: MainCtrl', function() {

  // Define this test's local variables
  var scope,
      $location,
      MainCtrl;

  // Load the controller's module
  beforeEach(angular.mock.module('app'));

  /* jshint camelcase:false */
  // Initialize the controller and scope
  beforeEach(angular.mock.inject(function($controller, $rootScope, _$location_) {
    scope = $rootScope.$new();
    $location = _$location_;
    spyOn($location, 'path');
    MainCtrl = $controller('MainCtrl', {
      $scope: scope,
      API: {token: false},
      $location: $location
    });

  }));

  it('should exist', function() {
    expect(MainCtrl).toBeTruthy();
  });

  describe('when created', function() {

    it('should call $location accordingly', function () {
      expect($location.path).toHaveBeenCalledWith('/');
    });

  });

});