3

在为 React Native 项目编写单元测试时,我希望能够测试基于不同平台的不同快照。

我首先尝试jest.mock模拟Platform,但似乎是异步的。当我有两个单独的文件时,这种方法确实有效,但如果可能的话,我更愿意将所有内容保存在一个文件中。

我尝试jest.doMock了因为文档中的这个片段:

使用 babel-jest 时,对 mock 的调用将自动提升到代码块的顶部。如果您想明确避免此行为,请使用此方法。 https://facebook.github.io/jest/docs/en/jest-object.html#jestdomockmodulename-factory-options

但是,我仍然看到不希望的结果。当我console.log在 android 测试中时,我看到这Platform.OS就是我设置的第一个doMock

我还尝试将模拟包装在 abeforeEach中,describe因为我认为这可能有助于确定范围 http://facebook.github.io/jest/docs/en/setup-teardown.html#scoping

 describe('ios test', () => {
  it('renders ui correctly', () => {
    jest.doMock('Platform', () => {
      const Platform = require.requireActual('Platform');
      Platform.OS = 'ios';
      return Platform;
    });
    const wrapper = shallow(<SomeComponent />);
    const tree = renderer.create(wrapper).toJSON();
    expect(tree).toMatchSnapshot();
  });
});

describe('android test', () => {
  it('renders ui correctly', () => {
    jest.doMock('Platform', () => {
      const Platform = require.requireActual('Platform');
      Platform.OS = 'android';
      return Platform;
    });
    const wrapper = shallow(<SomeComponent />);
    const tree = renderer.create(wrapper).toJSON();
    expect(tree).toMatchSnapshot();
  });
});

关于如何更改模拟平台以在同一文件中进行测试的任何想法?

4

1 回答 1

4

在另一个问题中有很多关于如何解决这个问题的建议,但是考虑到您的要求相同(在同一个套件文件和一次测试运行中测试不同操作系统),它们都没有对我有用。

我最终使用了一个可以在测试中按预期模拟的有点笨拙的琐碎辅助函数来解决它——比如:

export function getOS() {
  return Platform.OS;
}

使用它而不是Platform.OS在您的代码中,然后在您的测试中简单地模拟它,例如

it('does something on Android', () => {
  helpers.getOS = jest.fn().mockImplementationOnce(() => 'android');
  // ...
}

那成功了;这个想法的功劳归功于这个家伙

于 2018-02-09T13:55:33.280 回答