我正在为redux动作编写单元测试,没有其他正在运行的测试。 当我运行npm run test时,它会找到用于动作测试的文件并运行它。 测试失败并抛出未定义模块的错误。
我尝试模拟该模块,在此之后它可以正常工作, 但是为什么测试动作只要求我模拟未导入动作文件中的模块
动作测试代码:
import * as actions from '../app/screens/NewOrders/NewOrdersAction'
import AppConstants from '../app/Constants/AppConstants'
import { Thunk } from 'redux-testkit';
describe('actions validation for New Orders Action Component', async() => {
it('should get the Service Orders', async () => {
const expectedAction = {
type: AppConstants.SET_ORDERS,
payload: {"data": 12}
}
const dispatches = await Thunk(actions.getOrders).execute('shubham.anand','5',5);
expect(dispatches[0].getAction()).toEqual(expectedAction);
})
});
操作代码:
import AppConstants from '../../Constants/AppConstants'
import {GetData} from '../../Utils/Utils'
/**
* @module NewOrdersAction
*/
/**
*This action is used to get the service orders in the Tasks based on the UserID
*@function getServiceOrders
*/
export const getOrders = (user_id,id,orderlimit) => dispatch => {
GetData.getOrders(user_id,id,orderlimit).then(res => {
if (!res.error) {
dispatch({
type: AppConstants.SET_ORDERS,
payload: res
})
}
})
}
TypeError: Cannot read property 'trackEvent' of undefined
> 1 | import React from "react";
2 | import {
3 | Animated,
4 | Dimensions,
at Object.trackEvent (node_modules/appcenter-analytics/Analytics.js:13:46)
at Object.<anonymous> (app/screens/SplashScreen/SplashScreenLoader.js:1:1819)
at Object.<anonymous> (app/index.js:1:858)
at Object.<anonymous> (index.js:1:1031)
Trackevent是我用于分析的模块中的一种方法
答案 0 :(得分:0)
您的测试找不到节点模块,因此您必须对其进行模拟。模拟它破坏了它的本机行为,但是它绕开了测试以尝试加载无法正确找到的模块的需要。在测试文件中,您需要类似以下内容的文件。这会自动模拟appcenter-analytics
中的每个函数。
import Analytics from 'appcenter-analytics'
jest.mock('appcenter-analytics')
如果您实际上需要运行trackEvent
进行测试,则仍然可以对其进行模拟。但是您给它一个实际的return
值,里面没有算法逻辑。在下面显式模拟trackEvent
,并以return
的回调形式为函数提供一些默认的jest.fn
值
// in your test, regardless of the arguments put in, the function that runs it will evaluate to 1000
Analytics.trackEvent= jest.fn(() => 1000)
编辑:
在某个时间点,正在测试的文件中正在使用或导入trackEvent
。它可能是文件本身的导入,也可能是来自其他文件的功能的一部分,在某些情况下,该文件需要运行才能运行该功能。这可能是从代码库中的另一个文件导入的,该文件也导入了trackEvent
。显式函数是否不使用trackEvent
都没关系。这些文件仍然必须完整运行,这意味着它还尝试从文件中的每个import语句获取数据。
您的代码必须能够运行,然后才能进行测试。因此,如果尝试运行找不到的功能(在本例中为trackEvent
),它将失败。
此行为与您的代码库的任何部分都没有不同。可以使用尚未安装的npm软件包运行功能吗?您的测试环境不同于生产和开发环境