шутить насмешливые константы из модуля gobal - PullRequest
0 голосов
/ 20 марта 2019

Я играю с Джестом и пытаюсь понять, как издеваться над объектом.Большинство примеров, которые я вижу, показывают, как смоделировать функцию.

Это мой компонент AboutScreen.js

import React from 'react';
import { Constants, WebBrowser } from 'expo';
import { View, Text } from 'react-native';
import config from '../config';

const AboutScreen = () => {
const { termsAndConditionsUrl, privacyPolicyUrl } = config;
const { releaseChannel, version } = Constants.manifest;
const channel = (releaseChannel === undefined) ? 'DEV' : releaseChannel;
return (
    <View>
        <Text>Version: {version}, Release-channel: {channel}</Text>
        <Text testId={"t-and-c"} onPress={() => WebBrowser.openBrowserAsync(termsAndConditionsUrl)}>
    Terms & conditions
        </Text>
    </View>
  );
};


export default AboutScreen;

Мой тест в AboutScreen.test.js выглядит следующим образом

 import React from 'react';
 import { shallow } from 'enzyme';
 import config from '../../config';
 import AboutScreen from '../AboutScreen';
 import { Constants, WebBrowser } from 'expo';
 const { termsAndConditionsUrl, privacyPolicyUrl } = config;

  jest.mock('expo', () => ({
   Constants:{
     manifest: {
       version: '0.0.1',
       releaseChannel: 'PROD',
    }},
  }));

  it('renders with releaseChannel and version', () => {
    const wrapper = shallow(<AboutScreen />);
    expect(wrapper).toMatchSnapshot();
    expect(wrapper).toContain('PROD');
    expect(wrapper).toContain('0.0.1');
  });

  jest.mock('expo', () => ({
   Constants:{
     manifest: {
       version: '0.0.2',
    }},
  }));

  it('renders with default releaseChannel', () => {
    const wrapper = shallow(<AboutScreen />);
    expect(wrapper).toMatchSnapshot();
    expect(wrapper).toContain('DEV');
    expect(wrapper).toContain('0.0.2');
   });

Для первого теста оболочка должна содержать «PROD» и версию как «0.0.1».

Но для второго теста оболочка должна содержать значение по умолчанию 'DEV'.

Второй тест, похоже, продолжает давать сбой, поскольку макет не переопределяет.

Я пробовал другойтакие параметры, как

jest.mock('expo');
import * as expo from 'expo';
expo.mockReturnValueOnce(); //but fails here as expo has no mockReturnValueOnce

Как я могу решить эту проблему?

1 Ответ

1 голос
/ 20 марта 2019

Вот полезный совет от Изучение ES6 :

Обратите внимание, что, хотя вы не можете изменить значения импорта, вы можете изменить объекты, на которые они ссылаются.

Итак, если вы импортировали что-то, вы не можете просто присвоить это чему-то другому ... но если это относится к объекту , тогда вы можетеизменить объект .


В этом тесте jest.mock будет издеваться expo, а import { Constants } from 'expo'; даст вам доступ к объекту Constants ... ... 1020 *

... а затем вы можете изменить этот объект :

import React from 'react';
import { shallow } from 'enzyme';
import config from '../../config';
import AboutScreen from '../AboutScreen';
import { Constants, WebBrowser } from 'expo';
const { termsAndConditionsUrl, privacyPolicyUrl } = config;

jest.mock('expo', () => ({
  Constants: {
    manifest: {
      version: '0.0.1',
      releaseChannel: 'PROD',
    }
  },
}));

it('renders with releaseChannel and version', () => {
  const wrapper = shallow(<AboutScreen />);
  expect(wrapper).toMatchSnapshot();  // Success!
  expect(wrapper.contains('PROD')).toBe(true);  // Success!
  expect(wrapper.contains('0.0.1')).toBe(true);  // Success!
});

it('renders with default releaseChannel', () => {
  Constants.manifest = {
    version: '0.0.2'
  };  // change the manifest property of Constants
  const wrapper = shallow(<AboutScreen />);
  expect(wrapper).toMatchSnapshot();  // Success!
  expect(wrapper.contains('DEV')).toBe(true);  // Success!
  expect(wrapper.contains('0.0.2')).toBe(true);  // Success!
});
...