我是第一次做测试,所以我很确定我做错了什么。
我在写测试用例,我的组件在内部做这个。
const {width, height} = Dimensions.get('window')
对于我的测试用例,我正在考虑尺寸为width: 414, height:896
的iPhone 11,我希望所有测试用例都保持一致。
React原生测试库,而测试设置宽度为750
,高度为1334
。
我想把它改成iPhone 11的尺寸,我在网上搜索了一下,找到了用jest.mock
来改变功能的文章。
所以我做了这样的操作
it('renders correctly', () => {
jest.mock("Dimensions", () => ({
get: jest.fn().mockReturnValue({ width: 414, height:896 }),
}))
const {getByTestId} = render(<Home />)
Home
组件有console.log(width, height)
,但它仍然给予宽度为750和高度为1334(因为我的测试用例失败)。
我该如何修复它?
如果您想在每个测试的基础上模拟Dimensions.get
的返回值,您可以使用jest.doMock
创建以下模拟函数。
const mockDimensions = ({ width, height }) => {
jest.resetModules()
jest.doMock('react-native/Libraries/Utilities/Dimensions', () => ({
get: jest.fn().mockReturnValue({ width, height })
}))
}
然后在测试开始时按如下方式调用它。
it('renders correctly', () => {
mockDimensions({ width: 414, height: 896 })
const { getByTestId } = render(<Home />)
// Your assertions
})
使用jest.doMock
而不是jest.mock
来避免提升,这允许我们模拟每个测试的尺寸,而不是全局的。
这在ios上对我很有效
import { Dimensions } from 'react-native';
jest.spyOn(Dimensions, 'get').mockReturnValue({ width: 414, height: 818 });
在测试中,我们覆盖Dimensions
返回的屏幕宽度const Dimensions = jest.requireActual(
"react-native/Libraries/Utilities/Dimensions"
);
return {
...Dimensions,
get: (param) => {
if (param === "window") {
return {
width: 310,
};
}
},
};
});