如何在Vuejs中测试受保护路由守卫的访问?
How to test the access of protected route guard with in Vuejs?
我使用 vue-router 方法 beforeEnter()
.
实施了一个路由守卫来保护 /settings
路由
我尝试测试该路由是否仅对管理员保护。
我正在使用 Vuejs 2、Vue-router、Vuex 和 vue-test-utils。
router.js
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
routes: [
..., // other routes
{
path: '/settings',
name: 'Settings',
component: () => import('./views/settings'),
beforeEnter: (to, from, next) => {
next(store.state.isAdmin);
}
}
]
});
单元测试:
test('navigates to /settings view if the user is admin', () => {
const localVue = createLocalVue();
localVue.use(Vuex);
localVue.use(VueRouter);
const router = new VueRouter();
const wrapper = shallowMount(App, {
stubs: ['router-link', 'router-view'],
localVue,
mocks: {
$store: store
},
router
});
wrapper.vm.$route.push({ path: '/settings' });
// test if route is set correctly
});
当前日志输出:
wrapper.vm.$route` is undefined.
如何正确挂载App并访问路由器?如何测试当前路由以验证管理员用户已成功重定向?
感谢洛根 link。这似乎是最好的解决方案:
到目前为止,还没有简单的方法来测试导航守卫。如果你想通过调用router.push
函数来模拟事件触发,那可就麻烦了。一个更好更简单的解决方案是在 beforeEach()
中手动调用守卫,但即使是这个解决方案也没有一个干净的方法。请参阅以下示例:
进入路线前
// my-view.js
class MyView extends Vue {
beforeRouteEnter (to, from, next) {
next(function (vm) {
vm.entered = true;
});
}
}
// my-view.spec.js
it('should trigger beforeRouteEnter event', function () {
const view = mount(MyView);
const spy = sinon.spy(view.vm.$options.beforeRouteEnter, '0'); // you can't just call view.vm.beforeRouteEnter(). The function exists only in $options object.
const from = {}; // mock 'from' route
const to = {}; // mock 'to' route
view.vm.$options.beforeRouteEnter[0](to, from, cb => cb(view.vm));
expect(view.vm.entered).to.be.true;
expect(spy).to.have.been.called;
});
我使用 vue-router 方法 beforeEnter()
.
/settings
路由
我尝试测试该路由是否仅对管理员保护。
我正在使用 Vuejs 2、Vue-router、Vuex 和 vue-test-utils。
router.js
import Vue from 'vue';
import Router from 'vue-router';
Vue.use(Router);
export default new Router({
routes: [
..., // other routes
{
path: '/settings',
name: 'Settings',
component: () => import('./views/settings'),
beforeEnter: (to, from, next) => {
next(store.state.isAdmin);
}
}
]
});
单元测试:
test('navigates to /settings view if the user is admin', () => {
const localVue = createLocalVue();
localVue.use(Vuex);
localVue.use(VueRouter);
const router = new VueRouter();
const wrapper = shallowMount(App, {
stubs: ['router-link', 'router-view'],
localVue,
mocks: {
$store: store
},
router
});
wrapper.vm.$route.push({ path: '/settings' });
// test if route is set correctly
});
当前日志输出:
wrapper.vm.$route` is undefined.
如何正确挂载App并访问路由器?如何测试当前路由以验证管理员用户已成功重定向?
感谢洛根 link。这似乎是最好的解决方案:
到目前为止,还没有简单的方法来测试导航守卫。如果你想通过调用router.push
函数来模拟事件触发,那可就麻烦了。一个更好更简单的解决方案是在 beforeEach()
中手动调用守卫,但即使是这个解决方案也没有一个干净的方法。请参阅以下示例:
进入路线前
// my-view.js
class MyView extends Vue {
beforeRouteEnter (to, from, next) {
next(function (vm) {
vm.entered = true;
});
}
}
// my-view.spec.js
it('should trigger beforeRouteEnter event', function () {
const view = mount(MyView);
const spy = sinon.spy(view.vm.$options.beforeRouteEnter, '0'); // you can't just call view.vm.beforeRouteEnter(). The function exists only in $options object.
const from = {}; // mock 'from' route
const to = {}; // mock 'to' route
view.vm.$options.beforeRouteEnter[0](to, from, cb => cb(view.vm));
expect(view.vm.entered).to.be.true;
expect(spy).to.have.been.called;
});