在控制器中我有一个使用$state.transitionTo
“重定向”到另一个状态的函数。
现在我被困在测试这个功能,我总是得到错误Error: No such state 'state-two'
。我怎么测试这个?我完全清楚控制器对其他状态一无所知,但我怎么能模仿这种状态呢?
一些代码:
angular.module( 'mymodule.state-one', [
'ui.state'
])
.config(function config($stateProvider) {
$stateProvider.state('state-one', {
url: '/state-one',
views: {
'main': {
controller: 'MyCtrl',
templateUrl: 'mytemplate.tpl.html'
}
}
});
})
.controller('MyCtrl',
function ($scope, $state) {
$scope.testVar = false;
$scope.myFunc = function () {
$scope.testVar = true;
$state.transitionTo('state-two');
};
}
);
describe('- mymodule.state-one', function () {
var MyCtrl, scope
beforeEach(module('mymodule.state-one'));
beforeEach(inject(function ($rootScope, $controller) {
scope = $rootScope.$new();
MyCtrl = $controller('MyCtrl', {
$scope: scope
});
}));
describe('- myFunc function', function () {
it('- should be a function', function () {
expect(typeof scope.myFunc).toBe('function');
});
it('- should test scope.testVar to true', function () {
scope.myFunc();
expect(scope.testVar).toBe(true);
expect(scope.testVar).not.toBe(false);
});
});
});
答案 0 :(得分:16)
免责声明:我自己没有这样做,所以我完全不知道它是否会起作用,而且是你的目标。
从我的头脑中,我想到了两个解决方案。
1。)在你的测试中,预先配置$stateProvider
以返回state-two
的模拟状态。这也是ui-router项目本身测试状态转换的方式。
2。)捕获并解析异常并将其解释为已完成的测试,如果尝试进入state-two
第二种方法似乎非常苛刻,所以我会投票给第一种方法。
然而,很可能我完全弄错了你应该休息一下。
beforeEach(module(function ($stateProvider) {
$stateProvider.state('state-two', { url: '/' });
}));
答案 1 :(得分:5)
我最近问这个问题是一个github问题,并且回答非常有帮助。 https://github.com/angular-ui/ui-router/issues/537
您应该执行$ rootScope。$ apply()然后才能进行测试。请注意,默认情况下,如果您使用templateUrl,您将收到视图的“意外GET请求”,但您可以通过将模板包含在测试中来解决此问题。
'use strict';
describe('Controller: CourseCtrl', function () {
// load the controller's module
beforeEach(module('myApp'));
// load controller widgets/views/partials
var views = [
'views/course.html',
'views/main.html'
];
views.forEach(function(view) {
beforeEach(module(view));
});
var CourseCtrl,
scope;
// Initialize the controller and a mock scope
beforeEach(inject(function ($controller, $rootScope) {
scope = $rootScope.$new();
CourseCtrl = $controller('CourseCtrl', {
$scope: scope
});
}));
it('should should transition to main.course', inject(function ($state, $rootScope) {
$state.transitionTo('main.course');
$rootScope.$apply();
expect($state.current.name).toBe('main.course');
}));
});
答案 2 :(得分:2)
此外,如果您希望转换是这样做的
expect(state.current.name).toEqual('state-two')
然后您需要在scope.$apply
之前expect()
才能使其正常工作