【问题标题】:Multiple React-dnd jest tests "Cannot have two HTML5 backends at the same time"多个 React-dnd 笑话测试“不能同时有两个 HTML5 后端”
【发布时间】:2020-01-24 10:10:42
【问题描述】:

我有一个 jest 测试文件,其中包含许多测试。

import React from 'react';
import configureStore from 'redux-mock-store';
import {Provider} from "react-redux";
import renderer from "react-test-renderer";
import HTML5Backend from "react-dnd-html5-backend";
import {DragDropContextProvider} from "react-dnd";

describe('My Component Tests', () => {
    let mockStore;
    let store;

    beforeEach(() => {
        mockStore = configureStore();
        store = mockStore(mockData);
    });

    test(' test1', () => {
        const cmpt = <Provider store={store}>
            <DragDropContextProvider backend={HTML5Backend}>
                <MyComponent state={1}/>
            </DragDropContextProvider>
        </Provider>;

        const tree = renderer.create(cmpt).toJSON();
        expect(tree).toMatchSnapshot();
    });

    test(' test2', () => {
        const cmpt = <Provider store={store}>
            <DragDropContextProvider backend={HTML5Backend}>
                <MyComponent state={2}/>
            </DragDropContextProvider>
        </Provider>;

        const tree = renderer.create(cmpt).toJSON();
        expect(tree).toMatchSnapshot();
    });
});

第一次测试总是有效

但是后面的总是会出现这个错误:

 Error: Uncaught [Error: Cannot have two HTML5 backends at the same time.]

我猜这是因为 HTMLBackend 被视为单例,并且用于跨测试,这不是我想要的。我想要独立运行的测试。

有没有在 beforeEach() 函数中创建 HTMLBackend 的实例。

我试图将 HTML5Backend 封装成一个单例,但我遇到了同样的问题:

let html5Backend = null;

function getSingleton() {
    if (!html5Backend) {
        html5Backend = HTML5Backend;
        debugger;
    }
    return html5Backend;
}

【问题讨论】:

    标签: react-dnd


    【解决方案1】:

    我通过在“描述”级别引用 HTMLBackend 实例解决了这个问题,如下所示:

    describe('My Component Tests', () => {
        let mockStore;
        let store;
    
        let htmlbe = HTML5Backend; //reference instance here!!!
    
        beforeEach(() => {
            mockStore = configureStore();
            store = mockStore(mockData);
        });
    
        test(' test1', () => {
            const cmpt = <Provider store={store}>
                <DragDropContextProvider backend={htmlbe }>
                    <MyComponent state={1}/>
                </DragDropContextProvider>
            </Provider>;
    
            const tree = renderer.create(cmpt).toJSON();
            expect(tree).toMatchSnapshot();
        });
    
        test(' test2', () => {
            const cmpt = <Provider store={store}>
                <DragDropContextProvider backend={htmlbe }>
                    <MyComponent state={2}/>
                </DragDropContextProvider>
            </Provider>;
    
            const tree = renderer.create(cmpt).toJSON();
    

    这相当于在所有测试中都有一个单例。

    【讨论】:

    • 实际上我认为我对这个答案还为时过早:(这似乎无法正常工作
    • 只是好奇,如果您将 test1 和 test2 拆分为单独的文件,它会起作用吗?
    • 也许它必须做 Jest 范围界定 (jestjs.io/docs/en/setup-teardown)
    猜你喜欢
    • 2017-09-16
    • 2018-08-17
    • 2020-11-12
    • 2018-07-15
    • 2022-01-04
    • 1970-01-01
    • 2018-10-19
    • 1970-01-01
    • 2022-11-24
    相关资源
    最近更新 更多