【发布时间】:2020-11-17 13:40:36
【问题描述】:
我正在尝试写笑话来测试我的组件。但是一旦调用了浅层,我的测试就会失败,因为调用 fetchUsers 函数说无法读取 null 的属性获取(这似乎是 myRequestor 的初始值)。它无法在 MyComponent 内的 MyReqUtil 功能组件中初始化 myRequestor 的值。看起来它没有调用此函数或没有初始化值。我被困在这个问题上,因为我无法每次都编写测试只是在我使用 shallow 的第一行失败了。任何人都可以帮我解决这个问题。
MyComponent.jsx
let myRequestor = null;
const MyReqUtil = () => {
myRequestor = React.useContext(MyRequestorContext);
return <ApplicationLoadingOverlay isOpen backgroundStyle="clear" />;
};
class MyComponent extends React.Component {
componentDidMount() {
this.setState({ isLoading: true });
this.fetchUsers();
}
fetchUsers() {
this.setState({ isLoading: true });
const { request } = myRequestor.get({
url: '/users',
});
request
.then(({ data }) => {
if (Object.prototype.hasOwnProperty.call(data[0], 'error')) {
this.setState({
error: 'Failure', errorMsg: data[0].error, isOpen: true, isLoading: false, userItems: [{ name: 'DEFAULT', id: 'Default' }],
});
return;
}
const users = data.map(user => ({
name: user.shortName,
id: user.key,
}));
this.setState({
userItems: users, isLoading: false,
});
})
.catch((error) => {
console.log(error);
this.setState({ error: 'Failure', isOpen: true, isLoading: false });
});
}
render() {
if (this.state.tenantItems === null) {
return <MyReqUtil />;
}
}
MyComponent.test.jsx
describe('<MyComponent />', () => {
let wrapper;
beforeEach(() => {
wrapper = shallow(<MyComponent />);
});
it('should check `componentDidMount()`', () => {
const instance = wrapper.instance();
jest.spyOn(instance, 'fetchUsers');
instance.componentDidMount();
expect(instance.fetchUsers).toHaveBeenCalledTimes(1);
});
it('Should Render Component Correctly', () => {
const spy = jest.spyOn(OrionReqUtil, 'fetchUsers');
const wrapper = shallow(<MyComponent />);
const instance = wrapper.instance();
spy.mockReturnValue(['mockItem1', 'mockItem2', 'mockItem3']);
});
});
【问题讨论】:
-
一个地方是
MyReqUtil,另一个地方是OrionReqUtil。您在测试方面遇到问题是一种症状。当糟糕的设计决策使单元更难测试并需要重构时,实际上就是这种情况。 -
很抱歉它实际上是 MyReqUtil。我已经编辑了代码
标签: reactjs react-native jestjs enzyme