【发布时间】:2021-05-25 10:53:28
【问题描述】:
按照blog post 中解释的 Kent C Dodds 提供者模式,我有一个上下文提供者组件以及一个使用该上下文的钩子。
钩子防止在提供者之外使用它,
export function useUser() {
const { user } = useContext(UserContext) || {};
const { switchUser } = useContext(SwitchUserContext) || {};
if (!user || !switchUser) {
throw new Error('Cannot use `useUser` outside of `UserProvider`');
}
return { user, switchUser };
}
为了测试场景,我创建了一个TestComponent 并在其中使用useUser 挂钩。
function TestComponent() {
const { user, switchUser } = useUser();
return (
<>
<p>User: {user.name}</p>
<button onClick={switchUser}>Switch user</button>
</>
);
}
我是这样测试的,
test('should throw error when not wrapped inside `UserProvider`', () => {
const err = console.error;
console.error = jest.fn();
let actualErrorMsg;
try {
render(<TestComponent />);
} catch(e) {
actualErrorMsg = e.message;
}
const expectedErrorMsg = 'Cannot use `useUser` outside of `UserProvider`';
expect(actualErrorMsg).toEqual(expectedErrorMsg);
console.error = err;
});
我目前必须模拟console.error,然后在测试结束时将其设置为原始值。有用。但我想让它更具声明性和更简单。有没有好的模式来实现它?
也许使用.toThrow() 的东西?
我有一个codesandbox,上面的代码可以在UserContext.js和UserContext.test.js找到。
注意:可以在 Tests 选项卡下的代码框本身中运行测试。
【问题讨论】:
标签: reactjs jestjs react-testing-library react-context