angular 使用 jasmine 测试路由时为空 $state 名称
angular empty $state name when testing routing with jasmine
像许多人一样,我是 Angular 测试 Jasmine 的新手,并且正在努力做到这一点。我使用 ui-router 进行路由,现在,我遇到的问题是测试中的 $state.current.name 是一个空字符串,并且我不知道为什么会这样。
这是我的路由模块中的代码:
var cacRouteViewMod = angular.module('cacRouteViewMod', ['ui.router', 'cacLib']);
cacRouteViewMod.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('countries', {
url: '/countries',
templateUrl: 'countries/countries.html',
controller: 'countriesCtrl',
resolve : {
countries: ["getCountry", function(getCountry) {
return getCountry();
}]
}
});
}]);
我写的测试是这样的:
describe('cac_app_views (routing)', function() {
var $rootScope,
$state,
$injector,
getCountryMock,
state = 'countries';
beforeEach(function() {
module('cacRouteViewMod', function($provide, $urlRouterProvider) {
$urlRouterProvider.deferIntercept();
$provide.value('getCountry', getCountryMock = {});
});
inject(function(_$rootScope_, _$state_, _$injector_, $templateCache) {
$rootScope = _$rootScope_;
$state = _$state_;
$injector = _$injector_;
$templateCache.put('countries/countries.html', '');
})
});
// Test 1
it('should respond to URL', function() {
expect($state.href(state)).toEqual('#/countries');
});
// Test 2
it('should resolve getCountry', function() {
getCountryMock = jasmine.createSpy('getCountry').and.returnValue('nanana');
$rootScope.$apply(function() {
$state.go('countries');
});
expect($state.current.name).toBe('countries');
expect($injector.invoke($state.current.resolve.countries)).toBe('nanana');
});
});
测试 1 没问题,但问题是测试 2。测试失败,因为它期望 '' 为 'countries'.
当我将 $state.current 登录到控制台时,它显示
Object {name: "", url: "^", views: null, abstract: true}
此时我感到非常绝望。谁能帮我 understand/solve 这个问题?
按照documentation$state.go
returns的承诺。
您应该使用 Jasmine 中的 done()
函数来测试这样的代码:http://ng-learn.org/2014/08/Testing_Promises_with_Jasmine/
我是这样解决的:
通过阅读类似的 stockoverflow 帖子,我为 $stateChangeError
设置了一个侦听器,它被触发了。我注销了 error
数据,发现它是一个 typeError: getCountry is not a function
。这导致 $state
没有更新,因此仍然包含原始(空)$state
.
我将 $provide.value
修改为:
$provide.value('getCountry', getCountryMock = function() {return 'nanana';});
表示“每当调用 getCountry
时,提供 getCountryMock
,这是一个 returns 字符串 'nanana'
.
的函数
现在所有测试都按照我希望的方式进行。
注意:我发现 getCountryMock = jasmine.createSpy.....
行代码在我对 $provide.value()
的其他更改中已过时,因此我将其注释掉。
像许多人一样,我是 Angular 测试 Jasmine 的新手,并且正在努力做到这一点。我使用 ui-router 进行路由,现在,我遇到的问题是测试中的 $state.current.name 是一个空字符串,并且我不知道为什么会这样。
这是我的路由模块中的代码:
var cacRouteViewMod = angular.module('cacRouteViewMod', ['ui.router', 'cacLib']);
cacRouteViewMod.config(['$stateProvider', '$urlRouterProvider', function($stateProvider, $urlRouterProvider) {
$stateProvider
.state('countries', {
url: '/countries',
templateUrl: 'countries/countries.html',
controller: 'countriesCtrl',
resolve : {
countries: ["getCountry", function(getCountry) {
return getCountry();
}]
}
});
}]);
我写的测试是这样的:
describe('cac_app_views (routing)', function() {
var $rootScope,
$state,
$injector,
getCountryMock,
state = 'countries';
beforeEach(function() {
module('cacRouteViewMod', function($provide, $urlRouterProvider) {
$urlRouterProvider.deferIntercept();
$provide.value('getCountry', getCountryMock = {});
});
inject(function(_$rootScope_, _$state_, _$injector_, $templateCache) {
$rootScope = _$rootScope_;
$state = _$state_;
$injector = _$injector_;
$templateCache.put('countries/countries.html', '');
})
});
// Test 1
it('should respond to URL', function() {
expect($state.href(state)).toEqual('#/countries');
});
// Test 2
it('should resolve getCountry', function() {
getCountryMock = jasmine.createSpy('getCountry').and.returnValue('nanana');
$rootScope.$apply(function() {
$state.go('countries');
});
expect($state.current.name).toBe('countries');
expect($injector.invoke($state.current.resolve.countries)).toBe('nanana');
});
});
测试 1 没问题,但问题是测试 2。测试失败,因为它期望 '' 为 'countries'.
当我将 $state.current 登录到控制台时,它显示
Object {name: "", url: "^", views: null, abstract: true}
此时我感到非常绝望。谁能帮我 understand/solve 这个问题?
按照documentation$state.go
returns的承诺。
您应该使用 Jasmine 中的 done()
函数来测试这样的代码:http://ng-learn.org/2014/08/Testing_Promises_with_Jasmine/
我是这样解决的:
通过阅读类似的 stockoverflow 帖子,我为 $stateChangeError
设置了一个侦听器,它被触发了。我注销了 error
数据,发现它是一个 typeError: getCountry is not a function
。这导致 $state
没有更新,因此仍然包含原始(空)$state
.
我将 $provide.value
修改为:
$provide.value('getCountry', getCountryMock = function() {return 'nanana';});
表示“每当调用 getCountry
时,提供 getCountryMock
,这是一个 returns 字符串 'nanana'
.
现在所有测试都按照我希望的方式进行。
注意:我发现 getCountryMock = jasmine.createSpy.....
行代码在我对 $provide.value()
的其他更改中已过时,因此我将其注释掉。