【发布时间】:2018-12-06 20:09:56
【问题描述】:
我正在使用 AngularJs 和来自 Angular-UI 的 ui-router 创建一个 SPA。现在我正在尝试创建身份验证逻辑。
$rootScope.$on("$stateChangeStart", function (event, toState) {
if(toState.authenticate && !MainService.isAuthenticated()) {
if($cookieStore.get('authToken')) {
MainService.loginWithToken($cookieStore.get('authToken'))
.then(function() {
$state.go(toState.name);
event.preventDefault();
});
}
$rootScope.requestPath = toState.name;
$state.go('public.login');
event.preventDefault();
}
if(toState.url == '/login' && MainService.isAuthenticated()) {
$state.go('private.main');
event.preventDefault();
}
});
在状态更改时,这会检查状态是否需要身份验证并在必要时转移到登录状态。此外,如果用户已登录,它会阻止达到登录状态。身份验证通过存储在 cookie 中的令牌完成。
这是我的量角器测试场景:
describe('Routes', function() {
it('Should go to the selected path if user logged in', function() {
browser.get('/');
expect(browser.getLocationAbsUrl()).toMatch("/login");
browser.manage().addCookie("authToken", "aaa");
browser.manage().getCookie("authToken").then(function(cookie) {
expect(cookie.name).toBe('authToken');
expect(cookie.value).toBe('aaa');
});
browser.get('/');
expect(browser.getLocationAbsUrl()).toMatch("/main");
browser.get('/#/main');
expect(browser.getLocationAbsUrl()).toMatch("/main");
/* This part fails, because, when the user is logged in,
he should be transfered to main state, if he is trying to reach the
login page. In this failing case, the user is able to reach the
/login even if he is logged in. */
browser.get('/#/login');
expect(browser.getLocationAbsUrl()).toMatch("/main");
browser.manage().deleteCookie("authToken");
browser.get('/#/login');
expect(browser.getLocationAbsUrl()).toMatch("/login");
browser.get('/#/main');
expect(browser.getLocationAbsUrl()).toMatch("/login");
});
});
当我尝试自己模拟测试行为时,一切正常,但是当我运行量角器时:
Message:
Expected 'http://localhost/#/login' to match '/main'.
堆栈跟踪: 错误:预期失败
【问题讨论】:
标签: angularjs angular-ui protractor