Jest - 为特定测试模拟模块中的常量属性

A.K*_*A.K 12 javascript testing unit-testing commonjs jestjs

所以,我正在尝试做一些表面上应该非常简单的事情......

我在以下定义了一些常量:` //constants.js

module.exports = {
 MY_CONSTANT: "TEST"
}
Run Code Online (Sandbox Code Playgroud)

` 我有一个我正在尝试测试的文件,它有一个这样的分支语句:

`

//file to test
//...

if(CONSTANTS.MY_CONSTANT === "TEST")
{...}
...
Run Code Online (Sandbox Code Playgroud)

`

我有一个这样的测试:`

//test


 it("Should do something when MY_CONSTANT === "TEST, () => {
    //This is fine as it is exported as TEST
    })


 it("Should do something else when MY_CONSTANT !== "TEST, () => {
    //This seems annoyingly difficult to get working...
    })
Run Code Online (Sandbox Code Playgroud)

`

我试过这个 - 运气不好,它不会改变实际值

我试过改变常量导出来导出一个对象(那没有用)

我试过在我的测试文件中为常量添加一个 jest.mock(..) 并在测试中做一个 unmock 我不需要它们被嘲笑。

我尝试在测试函数中添加 jest.doMock(...) 我需要更改值。(连同 jest.resetModules 和另一个需要)

我已经尝试将 jest.doMock(...) 添加到测试 beforeEach (以及 jest.resetModules 和另一个要求)

我真的很茫然......实际上我想做的就是在测试运行之前更改属性值

更新 所以我做了一些建议:

我现在有一个与常量文件夹相邻的模拟文件夹它包含一个与实际常量文件相同的文件和一个自定义导出

然后我jest.mock("../constants);在测试中添加了。

然后我还在const funcImTesting = require("../../file").testFunction测试中添加了一个。

仍然常数保持不变,测试失败

Ron*_*tro 20

导出我想要模拟的常量值的文件:

// utils/deviceTypeUtils file
import DeviceInfo from 'react-native-device-info';

export const isTablet = DeviceInfo.isTablet();
Run Code Online (Sandbox Code Playgroud)

在我的测试文件中,我使用以下代码来模拟常量isTablet

// file: deviceTypeUtils.spec
const DeviceTypeUtilsMock = jest.requireMock('../utils/deviceTypeUtils');
jest.mock('../utils/deviceTypeUtils', () => ({
  isTablet: false,
}));

describe('mock const example', () => {
  it('mock const `isTablet` to the value `true`', () => {
    DeviceTypeUtilsMock.isTablet = true;
  });

  it('mock const `isTablet` to the value `false`', () => {
    DeviceTypeUtilsMock.isTablet = false;
  });
});
Run Code Online (Sandbox Code Playgroud)


Ben*_*n T 7

我已经能够按照https://mikeborozdin.com/post/changing-jest-mocks- Between-tests/ 上的帖子做类似的事情

这会创建一个模拟,然后为每个测试更改它。

import * as constants from './constants'

jest.mock('./constants', () => ({
  __esModule: true,
  MY_CONSTANT: 'SOME OTHER DEFAULT',
}))

it("Should do something when MY_CONSTANT === "TEST, () => {
  constants.MY_CONSTANT = 'TEST'
  expect(constants.MY_CONSTANT).toBe('TEST')
})

it("Should do something else when MY_CONSTANT !== "TEST, () => {
  constants.MY_CONSTANT = 'NOT A TEST'
  expect(constants.MY_CONSTANT).toBe('NOT A TEST')
})
Run Code Online (Sandbox Code Playgroud)

如果您使用的是打字稿,那么需要转换模拟来修改模拟值:

const mockConstants = constants as { MY_CONSTANT: string }
mockConstants.MY_CONSTANT = 'TEST'
Run Code Online (Sandbox Code Playgroud)


Hit*_*nds 6

仅模拟一项测试:

jest.mock('./constants.js', () => ({
  MY_CONSTANT: 'something fake'
}));
Run Code Online (Sandbox Code Playgroud)

https://jestjs.io/docs/en/manual-mocks


为每个测试提供一个模拟:

  1. 创建一个与您想要模拟的模块相邻__mocks__目录
  2. 提供实施
  3. 调用jest.mock('./moduleName')你的测试

https://jestjs.io/docs/en/manual-mocks#mocking-user-modules

  • 所以这是真的,我可以做到。但是,由于有 2 个测试并且每个测试都测试不同的常量值……我无法看到为 1 个单个测试模拟它。所以这不是一个真正适用的解决方案 (2认同)

Fan*_*Bao 5

遵循文档的指导jest.doMock()

文件config.js

export const env = 'test';
Run Code Online (Sandbox Code Playgroud)

文件myComponent.js

import {env} from './config.js';

export const MyComponent = () => {
  if (env === 'prod') {
    return (<Text>Prod Env</Text>);
  } else if (env === 'test'){
    return (<Text>Test Env</Text>);
  } else {
    return (<Text>Dev Env</Text>);
  }
};
Run Code Online (Sandbox Code Playgroud)

文件myComponent.test.js

describe('Test MyComponent', () => {
  test('Test in prod env', () => {
    jest.doMock('./config', () => ({env: 'prod'}));
    const {MyComponent} = require('./myComponent.js');
    const myComp = mount(<MyComponent />);
    expect(myComp.find('Text')).toHaveText('Prod Env');
  });

  test('Test in test env', () => {
    jest.doMock('./config', () => ({env: 'test'}));
    const {MyComponent} = require('./myComponent.js');
    const myComp = mount(<MyComponent />);
    expect(myComp.find('Text')).toHaveText('Test Env');
  });

  test('Test in dev env', () => {
    jest.doMock('./config', () => ({env: 'dev'}));
    const {MyComponent} = require('./myComponent.js');
    const myComp = mount(<MyComponent />);
    expect(myComp.find('Text')).toHaveText('Dev Env');
  });
});
Run Code Online (Sandbox Code Playgroud)