使用玩笑测试动作会抛出未找到错误模块,组件中使用了模块

时间:2019-07-18 09:17:23

标签: reactjs react-native redux jestjs enzyme

我正在为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是我用于分析的模块中的一种方法

1 个答案:

答案 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软件包运行功能吗?您的测试环境不同于生产和开发环境