我正在与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
我该如何解决?
答案 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