我正在尝试模拟作为默认导出导出的异步函数,但我得到的只是 TypeError:无法读取未定义的属性’then’
我想模拟的是 config.js :
const configureEnvironment = async (nativeConfig) => { return { await whatever() } }
我正在测试的文件是 Scene.js :
import configureEnvironment from './config'; class Scene extends React.Component { constructor(props) { nativeConfig = {}; configureEnfironment(nativeConfig).then((config) => { // Do stuff } } }
我的测试文件是 Scene.test.js :
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); }); });
但是,运行测试的结果是:
TypeError: Cannot read property 'then' of undefined
我了解问题出在我模拟configureEnvironment的方式上,但是我无法使其正常运行。
我还尝试模拟该功能,例如:
jest.mock('./config', () => { return { default: configureEnvironmentMock, }; });
但结果是:
TypeError: (0 , _config2.default) is not a function
模拟模块默认导出的一种简单明了的方法是将其jest.spyOn与结合使用mockImplementation。
jest.spyOn
mockImplementation
这是一个基于上面的代码片段的工作示例:
config.js
const whatever = async () => 'result'; const configureEnvironment = async (nativeConfig) => await whatever(); export default configureEnvironment;
Scene.js
import * as React from 'react'; import configureEnvironment from './config'; export class Scene extends React.Component { constructor(props) { super(props); configureEnvironment(props.prevState).then((config) => { // Do stuff }); } render() { return null; } }
Scene.test.js
import React, { Fragment } from 'react'; import { shallow } from 'enzyme'; import { Scene } from './Scene'; import * as config from './config'; describe('Scene', () => { const mock = jest.spyOn(config, 'default'); // spy on the default export of config mock.mockImplementation(() => Promise.resolve('config')); // replace the implementation const getScene = (previousState) => { return shallow( <Scene prevState={previousState}> <Fragment /> </Scene>, ); }; it('calls configureEnvironment with the nativeConfig', async () => { expect.assertions(1); const nativeConfig = {}; getScene(nativeConfig); expect(mock).lastCalledWith(nativeConfig); // SUCCESS }); });