来自gobal模块的开玩笑的模拟常量

时间:2019-03-19 23:58:16

标签: mocking jestjs expo

我正在与Jest一起玩,并且努力弄清楚如何模拟对象。我看到的大多数示例都展示了如何模拟函数。

这是我的组件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 个答案:

答案 0 :(得分:1)

这是Exploring ES6的一个实用技巧:

  

请注意,虽然您无法更改导入的值,但是可以更改它们所引用的对象。

因此,如果您导入了某些内容,则不能仅将其分配给其他内容...但是,如果它引用了 object ,则您可以更改对象


在此测试中,void insertIntoList(CourseNode **ppHead, CourseNode *pNew) { CourseNode *p; if(*ppHead == NULL) { *ppHead = pNew return; } for(p = *ppHead; p->pNext != NULL; p = p->pNext){ //do nothing } p->pNext = pNew; } 将模拟jest.mock,而expo将使您可以访问模拟的import { Constants } from 'expo';对象...

...然后您可以更改该对象

Constants