Javascript 来自默认导入的Jest模拟异步函数

Javascript 来自默认导入的Jest模拟异步函数,javascript,reactjs,unit-testing,react-native,jestjs,Javascript,Reactjs,Unit Testing,React Native,Jestjs,我试图模拟作为默认导出导出的异步函数,但得到的结果是TypeError:无法读取未定义的属性“then” 我试图模仿的是config.js: const configureEnvironment = async (nativeConfig) => { return { await whatever() } } import configureEnvironment from './config'; class Scene extends React.Component {

我试图模拟作为默认导出导出的异步函数,但得到的结果是TypeError:无法读取未定义的属性“then”

我试图模仿的是config.js

const configureEnvironment = async (nativeConfig) => {
    return { await whatever() }
}
import configureEnvironment from './config';

class Scene extends React.Component {
    constructor(props) {
        nativeConfig = {};
        configureEnfironment(nativeConfig).then((config) => {
            // Do stuff
        }
    }
}
let getScene = null;
const configureEnvironmentMock = jest.fn();

describe('Scene', () => {
    jest.mock('./config', () => configureEnvironmentMock);

    const Scene = require('./Scene').default;

    getScene = (previousState) => {
        return shallow(
            <Scene prevState={previousState}>
                <Fragment />
            </Scene>,
        );
    };

    it('calls configureEnvironment with the nativeConfig', async () => {
        expect.assertions(1);
        const nativeConfig = {};

        getScene(nativeConfig);

        expect(configureEnvironmentMock).toHaveBeenCalledWith(nativeConfig);
    });
});
我正在测试的文件是Scene.js

const configureEnvironment = async (nativeConfig) => {
    return { await whatever() }
}
import configureEnvironment from './config';

class Scene extends React.Component {
    constructor(props) {
        nativeConfig = {};
        configureEnfironment(nativeConfig).then((config) => {
            // Do stuff
        }
    }
}
let getScene = null;
const configureEnvironmentMock = jest.fn();

describe('Scene', () => {
    jest.mock('./config', () => configureEnvironmentMock);

    const Scene = require('./Scene').default;

    getScene = (previousState) => {
        return shallow(
            <Scene prevState={previousState}>
                <Fragment />
            </Scene>,
        );
    };

    it('calls configureEnvironment with the nativeConfig', async () => {
        expect.assertions(1);
        const nativeConfig = {};

        getScene(nativeConfig);

        expect(configureEnvironmentMock).toHaveBeenCalledWith(nativeConfig);
    });
});
我的测试文件是Scene.test.js

const configureEnvironment = async (nativeConfig) => {
    return { await whatever() }
}
import configureEnvironment from './config';

class Scene extends React.Component {
    constructor(props) {
        nativeConfig = {};
        configureEnfironment(nativeConfig).then((config) => {
            // Do stuff
        }
    }
}
let getScene = null;
const configureEnvironmentMock = jest.fn();

describe('Scene', () => {
    jest.mock('./config', () => configureEnvironmentMock);

    const Scene = require('./Scene').default;

    getScene = (previousState) => {
        return shallow(
            <Scene prevState={previousState}>
                <Fragment />
            </Scene>,
        );
    };

    it('calls configureEnvironment with the nativeConfig', async () => {
        expect.assertions(1);
        const nativeConfig = {};

        getScene(nativeConfig);

        expect(configureEnvironmentMock).toHaveBeenCalledWith(nativeConfig);
    });
});
我知道问题正在我模拟配置环境的过程中,但我无法让它工作

我还尝试模拟函数,如:

jest.mock('./config', () => {
    return {
        default: configureEnvironmentMock,
    };
});
但其结果是:

TypeError: (0 , _config2.default) is not a function

模拟模块默认导出的一种干净而简单的方法是与函数(如)结合使用


以下是基于上述代码片段的工作示例:

config.js

constwhere=async()=>result';
const configureEnvironment=async(nativeConfig)=>wait whatever();
导出默认配置环境;

Scene.js

import*as React from'React';
从“/config”导入configureEnvironment;
导出类场景扩展React.Component{
建造师(道具){
超级(道具);
configureEnvironment(props.prevState)。然后((config)=>{
//做事
});
}
render(){
返回null;
}
}

Scene.test.js

import React,{Fragment}来自'React';
从“酶”导入{shall};
从“/Scene”导入{Scene};
从“/config”导入*作为配置;
描述('场景',()=>{
const mock=jest.spyOn(config,'default');//监视config的默认导出
mock.mockImplementation(()=>Promise.resolve('config');//替换实现
const getScene=(以前的状态)=>{
返回浅层(
,
);
};
它('使用nativeConfig调用configureEnvironment',async()=>{
期望.断言(1);
const nativeConfig={};
获取场景(nativeConfig);
expect(mock).lastCalledWith(nativeConfig);//成功
});
});

你可以像这样开玩笑地模仿任何东西

jest.mock(“@material ui/core/withWidth”,()=>({
__艾斯莫杜勒:没错,
isWidthUp:jest.fn((a,b)=>true),
默认值:jest.fn(fn=>fn=>fn)

}))

工作非常完美。对我来说,关键是能够从“/config”以
import*as-config的形式导入允许监视默认导出。I get“无法监视默认属性,因为它不是函数;改为“指定对象”。我想这只有在导出为function@Marc是的,此方法适用于默认导出为函数时如何将其用于命名导出?以及在测试后如何恢复它?