【问题标题】:Replace default export object with jest用玩笑替换默认导出对象
【发布时间】:2021-09-13 10:51:48
【问题描述】:

我想在每个测试中使用新的 Vuex 存储,所以我希望用测试存储替换默认存储。原因是我的路由器正在使用 store getter 来检查是否允许用户访问特定路由。

问题是它总是使用默认存储,测试组件不使用它。我试图模拟 @\store,但看起来我错过了一些东西。

@\store\index.ts

import {createStore, Store} from 'vuex'
import {State} from '@vue/runtime-core'
import auth from "@/store/modules/auth";

export const createNewStore = (): Store<State> => (createStore({
    modules: {
        auth,
    },
}))

export default createNewStore()

@\router\index.ts

import {createMemoryHistory, createRouter, createWebHistory, Router, RouteRecordRaw} from 'vue-router'
import store from '@/store';

const routes: Array<RouteRecordRaw> = [ ... ]

export const createNewRouter = (): Router => {
    const isServer = Boolean(typeof module !== 'undefined' && module.exports)
    const router = createRouter({
        history: isServer ? createMemoryHistory() : createWebHistory(process.env.BASE_URL),
        routes
    })
    router.beforeEach((to, from, next) => {
        if (to.matched.some(record => !record.meta.doesntRequiresAuth) && !store.getters['auth/isAuthenticated']) {
            next({name: 'login'})
        } else {
            next()
        }
    })
    return router
}

export default createNewRouter()

当前的实现如下所示:

@\views\__tests__\Login.spec.ts

import {render, screen} from '@testing-library/vue';
import AppComponent from '../../App.vue';
import userEvent from "@testing-library/user-event";
import {createNewRouter} from "@/router";
const {createNewStore} = jest.requireActual('@/store');
import {Router} from "vue-router";

describe('Login.vue', () => {
    let router : Router

    const renderComponentWithDependencies = async () => {
        const mockStore = createNewStore();

        jest.doMock('@/store', () => ({
            __esModule: true,
            default: mockStore,
        }));
        router = createNewRouter();
        await router.push('/')
        render(AppComponent, {
            global: {
                plugins: [router, mockStore],
            }
        })
    }

    beforeEach(async () => {
        await renderComponentWithDependencies()
        fetchMock.resetMocks();
    });

    it('User logs with correct username and pin', async () => {
        const username = 'Pavel'
        const pin = 'test'

        fetchMock.mockResponseOnce(JSON.stringify({}));
        fetchMock.mockResponseOnce(JSON.stringify({token: "123"}));

        await screen.findByLabelText("Имя пользователя")
        userEvent.type(screen.getByLabelText("Имя пользователя"), username)
        await userEvent.click(screen.getByText('Запросить пин'))
        userEvent.type(await screen.findByLabelText('Пин код'), pin)
        await userEvent.click(screen.getByText('Войти'))
        await router.isReady()
        await screen.findByText('You are on home page')
    })
})

【问题讨论】:

    标签: vue.js jestjs vuex


    【解决方案1】:

    原来有更好的解决方案我不知道,它不需要嘲笑 - 使用jest.resetModules()

    import {render, screen} from '@testing-library/vue';
    import AppComponent from '../../App.vue';
    import userEvent from "@testing-library/user-event";
    import router from "@/router";
    import store from '@/store';
    
    describe('Login.vue', () => {
        const renderComponentWithDependencies = async () => {
            await router.push('/')
            // We use App component instead of Login to test routing to homepage at the end of the login
            render(AppComponent, {
                global: {
                    plugins: [router, store],
                }
            })
        }
    
        beforeEach(async () => {
            await renderComponentWithDependencies()
            fetchMock.resetMocks();
            jest.resetModules();
        });
    
        it('User logs with correct username and pin', async () => {
            const username = 'Pavel'
            const pin = 'test'
    
            fetchMock.mockResponseOnce(JSON.stringify({}));
            fetchMock.mockResponseOnce(JSON.stringify({token: "123"}));
    
            await screen.findByLabelText("Имя пользователя")
            userEvent.type(screen.getByLabelText("Имя пользователя"), username)
            await userEvent.click(screen.getByText('Запросить пин'))
            userEvent.type(await screen.findByLabelText('Пин код'), pin)
            await userEvent.click(screen.getByText('Войти'))
            await router.isReady()
            await screen.findByText('You are on home page')
        })
    })
    

    【讨论】:

      猜你喜欢
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2018-04-13
      • 1970-01-01
      • 2018-07-25
      • 2021-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多