在为我的自定义react钩子创建测试时,我遇到了一个难题。(我是测试新手(
基本上,我有这个钩子useUpdateProfileName,它使用useSelectProfile钩子来管理我的配置文件的状态(配置文件是一个对象(,它所做的唯一事情就是更新当前所选配置文件的名称。
import { useSelectProfile } from './use-select-profile';
export const useUpdateProfileName = () => {
const { selectedProfile, setSelectedProfile } = useSelectProfile();
const updateName = (name: string) => {
selectedProfile.name = name;
setSelectedProfile(selectedProfile);
};
return { updateName };
};
如何模拟我的useSelectProfile挂钩,以便在使用给定字符串执行updateName时可以使用selectedProfile进行验证?
describe('Use Update Profile Name', () => {
let profile: Profile;
beforeAll(() => {
profile = {name: 'Out of office'};
wrapper = ({ children }) => {
return (
<ProfileStoreProvider>{children}</ProfileStoreProvider>
);
};
});
it('Should update profile name', () => {
const { result } = renderHook(() => useUpdateProfileName(), { wrapper });
act(() => {
//setSelectedProfile(profile);
result.current.updateName('Online');
});
expect(selectedProfile).toHaveProperty('name', 'Online');
});
});
您不需要模拟钩子。您可以从useUpdateProfileName
挂钩返回selectedName
:
import { useSelectProfile } from './use-select-profile';
export const useUpdateProfileName = () => {
const { selectedProfile, setSelectedProfile } = useSelectProfile();
const updateName = (name: string) => {
selectedProfile.name = name;
setSelectedProfile(selectedProfile);
};
return { updateName, selectedProfile };
};
然后在测试中,您应该能够对result.current.selectedProfile
:进行断言
it("Should update profile name", () => {
const { result } = renderHook(() => useUpdateProfileName(), { wrapper });
act(() => {
result.current.updateName("Online");
});
expect(result.current.selectedProfile).toHaveProperty("name", "Online");
});