【问题标题】:Testing angularJS ui-router resolve functions测试 angularJS ui-router 解析函数
【发布时间】:2015-09-27 18:42:28
【问题描述】:

我正在使用 ui-router 0.2.15 和 jasmine 1.3 测试 angular 1.3 (coffeescript)

我的模块设置如下

angular.module('myModule', [
  'ui.router'
])

.config ($stateProvider) ->

  $stateProvider.state 'dashboard.settings.account',
    url:            '/account'
    controller:     'SettingsAccountController'
    templateUrl:    'dashboard/settings/account/account.tpl.html'
    resolve:
      phones: (Resolver) ->
        return Resolver.resolvePhones()

问题是:如何测试状态内的resolve函数?我在控制器中模拟了解析服务,因此其他测试工作正常,但我不知道如何获得这个特定功能。

【问题讨论】:

    标签: javascript angularjs coffeescript jasmine angular-ui-router


    【解决方案1】:

    不知道 CoffeeScript 语法,但这是我在常规 JS 中测试我的简单路由配置的方式。

        describe('ui-router config', function() {
    
          var $rootScope, $state, $injector, myServiceMock, state = 'dashboard.settings.account';
    
          beforeEach(function() {
    
            module('myModule', function($provide) {
              $provide.value('Resolver', myServiceMock = {});
            });
    
            inject(function(_$rootScope_, _$state_, _$injector_, $templateCache) {
              $rootScope = _$rootScope_;
              $state = _$state_;
              $injector = _$injector_;
              $templateCache.put('template.html', '');//empty html content 
            })
          });
    
          it('should respond to URL', function() {
            expect($state.href(state)).toEqual('#/state');
          });
    
          it('should resolve data', function() {
            myServiceMock.resolvePhones= jasmine.createSpy('resolvePhones').andReturn('findAll');
            // for jasmine version greater than 2.0, replace "andReturn" with "and.returnValue"
    
            $state.go(state);
            $rootScope.$digest();
            expect($state.current.name).toBe(state);
    
            // Call invoke to inject dependencies and run function
            expect($injector.invoke($state.current.resolve.data)).toBe('findAll');
          });
        });
    

    这也是我第一次测试路由配置。如果您的服务没有返回承诺,这可以正常工作。当服务方法返回承诺时,我遇到了问题。让我知道您是否可以使用服务返回承诺。

    【讨论】:

      【解决方案2】:

      您只需要在加载controller 之前注入正在解析的service

      var phones;
          beforeEach(inject(function(Resolver){
              phones =  Resolver.resolvePhones()
          }));
      

      现在在你的控制器中注入这个phones

      【讨论】:

      • 测试覆盖率不会将此作为对该特定功能的测试,而是服务本身。它必须来自空的 $state.current.resolve.phones。
      • 您的代码没有测试解析功能。没有错误。我需要找到一种方法来测试 .state 对象中的函数,而不是控制器
      • 您可以窥探 state 并手动调用 state.go 并检查手机是否可用
      • 我没有在测试运行时定义任何 $stateProviders,所以我无法调用 state.go,因为它无处可去。
      • 你可以在你的 beforeEach 中注入
      猜你喜欢
      • 1970-01-01
      • 2017-11-24
      • 1970-01-01
      • 2016-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多