测试stateProvider状态,如果在angularJS中的config中配置,则在$ state上返回null

rei*_*hin 5 javascript unit-testing angularjs angular-ui-router

我有一个像这样的配置:

angular.module('myModule', ['ui.router'])
.config(['$stateProvider', function($stateProvider) {
  $stateProvider
    .state('app.home', {
      abstract: true,
      url: '/home',
      template: '<div>Foo Bar</div>'
    });
}]);
Run Code Online (Sandbox Code Playgroud)

和像这样使用茉莉花的单元测试:

'use strict';

describe('Module: myModule', function() {
  var $rootScope, $state;

  beforeEach(module('ui.router'));
  beforeEach(module('myModule'));

  beforeEach(inject(function(_$rootScope_, _$state_) {
    $state = _$state_;
    $rootScope = _$rootScope_;
  }));

  it('must have a route state for home', function(){
    console.log($state.get('app.home')); // this returns null
  });
});
Run Code Online (Sandbox Code Playgroud)

但是我无法让配置中的状态显示在返回的数组上 $state.get()

我也检查了包含配置的文件,它就在那里.谁能说我做错了什么?基本上我只想测试我期望的状态是否存在于"myModule"的配置中

Phi*_*hil 10

首先,你不需要这个

beforeEach(module('ui.router'));
Run Code Online (Sandbox Code Playgroud)

因为您的模块已将其列为依赖项.

我的猜测是,你没有引入父app状态,所以app.home不会创建你的状态.

假设您的app状态已定义myAppModule,只需将您的module行更改为

beforeEach(module('myAppModule', 'myModule'));
Run Code Online (Sandbox Code Playgroud)

如果您不想将模块包含在app状态中,请模块之前包含一个创建伪父状态的配置函数.对于这一点,你需要包括ui.router.

beforeEach(module('ui.router', function($stateProvider) {
    $stateProvider.state('app', { abstract: true });
}, 'myModule'));
Run Code Online (Sandbox Code Playgroud)

或者,你可以窥探$stateProvider.state并使用一个expect来确保它被调用app.home,例如

var $stateProvider;

beforeEach(module('ui.router', function(_$stateProvider_) {
    $stateProvider = _$stateProvider_;
    spyOn($stateProvider, 'state');
}, 'myModule'));

it('must have a route state for home', function() {
    expect($stateProvider.state).toHaveBeenCalledWith('app.home', jasmine.any(Object));
});
Run Code Online (Sandbox Code Playgroud)