只要有某种类型的onClick、onChange等,似乎就有很多关于如何为钩子运行测试的内容,但如果你像下面这样将该函数传递给你的事件处理组件呢?
const Content: FC<Props> = ({ activeTab }) => {
const [count, setCount] = useState<number>(0);
function handleDateUpdate(dates: object) {
const totalCount = new GetTotal(dates, activeTab);
setCount(totalCount.totalAttendances());
}
useEffect(() => {
if (activeTab === 'Year') {
handleDateUpdate(new Date());
}
});
return (
<Container>
{activeTab === 'Month' && (
<Datepicker handleDateUpdate={handleDateUpdate} />
)}
<TotalAttendences count={count} />
</Container>
);
}
我想写一个测试,检查useEffect和handleDateUpdate中的if语句,以确保它正在做我想要做的事情。
如果您想测试是否调用了handleDateUpdate
,我建议将其提取到辅助文件中,然后用export function
导出。然后,通过执行以下操作将整个辅助文件导入到定义组件的文件中:import * as dateHelpers from '../path/to/file';
因此,当您调用组件中的函数时,您将以dateHelpers.handleDateUpdate
的身份进行调用。这将确保正确注入依赖项,以便您能够监视您在组件中调用的handleDateUpdate
函数的实例,以确保它被正确调用(或不被正确调用(。
由于activeTab
是<Content />
的道具,我将通过以下操作来测试useEffect
:
import { shallow } from enzyme;
// I'm using enzyme here, but you could use whatever React testing library you choose
import * as dateHelpers from '../path/to/file/'
describe('<Content />', () => {
let dateUpdateSpy;
beforeEach(() => {
dateUpdateSpy = jest.spyOn(dateHelpers, 'handleDateUpdate');
})
afterEach(() => {
jest.clearAllMocks()
})
it('should invoke handleDateUpdate() when the activeTab prop equals "Year"'), ()
=> {
shallow(<Content activeTab="Year" />);
expect(dateUpdateSpy).toHaveBeenCalledWith(new Date());
}
it('should not invoke handleDateUpdate() when the activeTab prop does not equal
"Year"'), () => {
shallow(<Content activeTab="Month" />);
expect(dateUpdateSpy).not.toHaveBeenCalled();
}
}
最后,您应该添加activeTab
作为useEffect
的依赖项,因为您只想在activeTab
更改时运行该回调函数。它将在装载时运行,但如果由于activeTab
更改之外的任何原因而出现重新发布程序,则将不必要地重新运行useEffect
。所以我会把它改为:
useEffect(() => {
if (activeTab === 'Year') {
dateHelpers.handleDateUpdate(new Date());
}
}, [activeTab]);
``