如何使用ui-router测试依赖于服务的AngularJS控制器?

沙吞

我的测试是:

(function() {
  describe('Login Controller', function() {
    beforeEach(module('myApp'));
    beforeEach(inject(function($injector) {
      var $controller, $httpBackend, $q, userServiceMock;
      self.$rootScope = $injector.get('$rootScope');
      self.$scope = $rootScope.$new();
      self.$state = $injector.get('$state');
      $q = $injector.get('$q');
      $httpBackend = $injector.get('$httpBackend');
      $controller = $injector.get('$controller');
      userServiceMock = {
        login: function(auth) {
          self.deferred = $q.defer();
          console.log("HERE!");
          return self.deferred.promise;
        }
      };
      self.createController = function() {
        return $controller('LoginController', {
          '$scope': self.$scope,
          '$rootScope': self.$rootScope,
          '$state': self.$state,
          'userService': userServiceMock
        });
      };
      return $httpBackend.whenPOST('http://localhost:9001/api/v1/session/check').respond({
        authenticated: true
      });
    }));
    it('should set the page title to "Login"', function() {
      self.createController();
      $scope.init();
      expect($rootScope.pageTitle).toBe('Login');
      return expect($scope.auth).toEqual({});
    });
    return it('should properly authenticate a user', function() {
      self.createController();
      $scope.init();
      $scope.auth = {
        username: '[email protected]',
        password: 'mypassword'
      };
      $scope.login();
      self.deferred.resolve({
        authenticated: true
      });
      $scope.$root.$digest();
      console.log($state.current.name);
      expect($state.current.name).toBe('dashboard');
    });
  });
})();

我想这很简单吗?我的控制器是:

myApp.controller('LoginController', [
  '$scope', '$rootScope', '$state', 'userService', function($scope, $rootScope, $state, userService) {
    $scope.init = function() {
      $rootScope.pageTitle = 'Login';
      return $scope.auth = {};
    };
    $scope.login = function() {
      return userService.login($scope.auth).then(function(response) {
        if (response.authenticated === true) {
          return $state.transitionTo('dashboard');
        } else {
          return console.log('bad password man');
        }
      });
    };
    return $scope.init();
  }
]);

我在测试中得到的是:

NFO [karma]: Karma v0.12.16 server started at http://localhost:9876/
INFO [launcher]: Starting browser PhantomJS
INFO [PhantomJS 1.9.7 (Mac OS X)]: Connected on socket TRjrAWL8PHdQ-bKqkyzK with id 61166122
LOG: 'HERE!'
PhantomJS 1.9.7 (Mac OS X) - Login Controller:
PhantomJS 1.9.7 (Mac OS X)  should set the page title to "Login" PASSED
PhantomJS 1.9.7 (Mac OS X)  should properly authenticate a user FAILED
PhantomJS 1.9.7 (Mac OS X): Executed 2 of 2 (1 FAILED) (0.02 secs / 0.018 secs)
PhantomJS 1.9.7 (Mac OS X)
PhantomJS 1.9.7 (Mac OS X) Login Controller should properly authenticate a user FAILED
    Error: Unexpected request: GET templates/dashboard.html
    No more request expected

发生这种情况的原因是因为状态已转换为dashboard,然后尝试加载dashboard.html模板。我不一定要测试。我只需要测试它是否处于正确的状态即可。如何正确设置?

我使用的是Angular UI Router,而不是内置的$routeProvider

吉尔·伯曼(Gil Birman)

您可以模拟出模板文件,从而避免使用HTTP错误$templateCache

$templateCache = $injector.get('$templateCache');
$templateCache.put('templates/dashboard.html','<div>blank or whatever</div>');

...另一种方法是$httpBackend...


顺便说一句,您不必花$injector时间,只需将可注射物添加到您的inject函数中即可。

beforeEach(inject(function($rootScope, $state, $httpBackend, $templateCache) {

我经常使用下划线语法来提高灵活性:

beforeEach(inject(function(_$rootScope_, _$state_, _$httpBackend_, _$templateCache_) {

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用ui-router中的ui-sref将参数传递给控制器

如何测试依赖于useContext钩子的react组件?

使用依赖于Spring Security的JUnit测试Spring Controller

如何使用Karma在AngularJS控制器中测试$ element?

如何为依赖于其他服务或数据库的服务编写单元测试

如何测试依赖于环境变量的Rust方法?

如何使用AngularJS在控制器中调用服务函数?

如何测试依赖于另一个服务(又依赖于Http服务)的服务/组件?

如何使用依赖于插件的代码运行测试?

单元测试Angular服务,该服务依赖于另一个使用InjectionToken的服务

我的代码执行如何依赖于登台服务器

我该如何测试依赖于DomSanitizer的管道?

如何测试依赖于库的代码?

如何编写依赖于存在的设备的systemd服务?

Angularjs和Jasmine:使用进行Ajax调用的服务测试控制器

如何测试依赖于moment.js的角度滤波器?

如何在AngularJS控制器中测试服务?

如何对一个依赖于其注册回调的Angular服务进行单元测试?

带有ui-router的AngularJS:从子级控制器更改父级依赖项的值

使用RSpec测试依赖于外部Cassandra调用的方法

如何使AngularJS控制器依赖于通过Ajax在rootScope上加载的值?

如何注入依赖于之前运行的脚本的服务?

如何使sysv服务依赖于systemd服务?

如何不依赖于服务器特定的选项而阻止大范围的IP?

如何测试依赖于先前测试通过的 AngularJS 服务?

如何测试依赖于硬件的功能?

如何从依赖项中使用控制器服务 api

如何测试依赖于包含 BehaviorSubject 的服务的 Angular 组件?

如何(py)测试依赖于当前时间的函数?