单元测试:调用onChange函数,但字段值没有更改

发布于 2025-02-11 13:31:49 字数 3826 浏览 1 评论 0原文

我正在使用jest编写单元测试。所有测试都通过了,但StartDateendDate返回一个不变的值,这是无法预期的。

我的代码:

    const { startDate, endDate, onChangeDateRange} = props

    const previousRange = () => {
        const difference = moment(endDate).diff(moment(startDate), 'days')
        onChangeDateRange({
            startDate: moment(startDate).subtract(difference + 1, 'days'),
            endDate: moment(endDate).subtract(difference + 1, 'days')
        })
    }

    const nextRange = () => {
        const difference = moment(endDate).diff(moment(startDate), 'days')
        onChangeDateRange({
            startDate: moment(startDate).add(difference + 1, 'days'),
            endDate: moment(endDate).add(difference + 1, 'days')
        })
    }

    const previousButton = (
        <Button tertiary onClick={previousRange}>
            <Row alignItems='center' gridGap={8}>
                <IconChevronLeft aria-hidden />
            </Row>
        </Button>
    )

    const nextButton = (
        <Button tertiary onClick={nextRange}>
            <Row alignItems='center' gridGap={8}>
                <IconChevronRight aria-hidden={true} />
            </Row>
        </Button>
    )

    return (
        <Row >
            {previousButton}
            {nextButton}
            <DateRangeCalendar
                startDate={startDate}
                endDate={endDate}
                onChangeDateRange={onChangeDateRange}
            />
        </Row>
    )
}

export default Date

我的测试代码:

describe('Date Component', () => {
    let wrapper
    const onChangeDateRange = jest.fn()

    it('renders Date with Button, and DateRangeCalendar as child components', () => {
        wrapper = shallow(
            <Date
                onChangeDateRange={onChangeDateRange}
                startDate='2022-3-28'
                endDate='2022-3-29'
            />
        )
        expect(wrapper.length).toEqual(1)
        expect(wrapper.find('Row').length).toEqual(3)
        expect(wrapper.find('DateRangeCalendar').length).toEqual(1)
        expect(wrapper.find('Button').length).toEqual(2)
        expect(wrapper.find('Text').length).toEqual(1)
        expect(wrapper.find('Spacer').length).toEqual(2)
    })

    it('should call onChangeDateRange when clicking previousButton ', () => {
        wrapper = shallow(
            <Date
                onChangeDateRange={onChangeDateRange}
                startDate='2022-3-28'
                endDate='2022-3-29'
            />
        )
        const DateRangeCalendar = wrapper.find('DateRangeCalendar')
        wrapper.find('Button').at(0).simulate('click')
        expect(onChangeDateRange).toHaveBeenCalledTimes(1)
        expect(DateRangeCalendar.props().startDate).toEqual('2022-3-26')
        expect(DateRangeCalendar.props().endDate).toEqual('2022-3-27')
    })

    it('should call onChangeDateRange when clicking nextButton  ', () => {
        wrapper = shallow(
            <Date
                intl={intl}
                onChangeDateRange={onChangeDateRange}
                startDate='2022-3-28'
                endDate='2022-3-29'
            />
        )
        const DateRangeCalendar = wrapper.find('DateRangeCalendar')
        wrapper.find('Button').at(1).simulate('click')
        expect(onChangeDateRange).toHaveBeenCalled()
        expect(DateRangeCalendar.props().startDate).toEqual('2022-3-30')
        expect(DateRangeCalendar.props().endDate).toEqual('2022-3-31')
    })
})

运行测试时,调用了on ChangeDaterange,但是StartDateendDate的值保持不变。它以startDate ='2022-3-28'endDate ='2022-3-29'返回。为什么值不更改?

I'm writing a unit test by using jest and enzyme. All tests passed but the startDate and endDate returns an unchanged value, which is not expected.

My code:

    const { startDate, endDate, onChangeDateRange} = props

    const previousRange = () => {
        const difference = moment(endDate).diff(moment(startDate), 'days')
        onChangeDateRange({
            startDate: moment(startDate).subtract(difference + 1, 'days'),
            endDate: moment(endDate).subtract(difference + 1, 'days')
        })
    }

    const nextRange = () => {
        const difference = moment(endDate).diff(moment(startDate), 'days')
        onChangeDateRange({
            startDate: moment(startDate).add(difference + 1, 'days'),
            endDate: moment(endDate).add(difference + 1, 'days')
        })
    }

    const previousButton = (
        <Button tertiary onClick={previousRange}>
            <Row alignItems='center' gridGap={8}>
                <IconChevronLeft aria-hidden />
            </Row>
        </Button>
    )

    const nextButton = (
        <Button tertiary onClick={nextRange}>
            <Row alignItems='center' gridGap={8}>
                <IconChevronRight aria-hidden={true} />
            </Row>
        </Button>
    )

    return (
        <Row >
            {previousButton}
            {nextButton}
            <DateRangeCalendar
                startDate={startDate}
                endDate={endDate}
                onChangeDateRange={onChangeDateRange}
            />
        </Row>
    )
}

export default Date

My test code:

describe('Date Component', () => {
    let wrapper
    const onChangeDateRange = jest.fn()

    it('renders Date with Button, and DateRangeCalendar as child components', () => {
        wrapper = shallow(
            <Date
                onChangeDateRange={onChangeDateRange}
                startDate='2022-3-28'
                endDate='2022-3-29'
            />
        )
        expect(wrapper.length).toEqual(1)
        expect(wrapper.find('Row').length).toEqual(3)
        expect(wrapper.find('DateRangeCalendar').length).toEqual(1)
        expect(wrapper.find('Button').length).toEqual(2)
        expect(wrapper.find('Text').length).toEqual(1)
        expect(wrapper.find('Spacer').length).toEqual(2)
    })

    it('should call onChangeDateRange when clicking previousButton ', () => {
        wrapper = shallow(
            <Date
                onChangeDateRange={onChangeDateRange}
                startDate='2022-3-28'
                endDate='2022-3-29'
            />
        )
        const DateRangeCalendar = wrapper.find('DateRangeCalendar')
        wrapper.find('Button').at(0).simulate('click')
        expect(onChangeDateRange).toHaveBeenCalledTimes(1)
        expect(DateRangeCalendar.props().startDate).toEqual('2022-3-26')
        expect(DateRangeCalendar.props().endDate).toEqual('2022-3-27')
    })

    it('should call onChangeDateRange when clicking nextButton  ', () => {
        wrapper = shallow(
            <Date
                intl={intl}
                onChangeDateRange={onChangeDateRange}
                startDate='2022-3-28'
                endDate='2022-3-29'
            />
        )
        const DateRangeCalendar = wrapper.find('DateRangeCalendar')
        wrapper.find('Button').at(1).simulate('click')
        expect(onChangeDateRange).toHaveBeenCalled()
        expect(DateRangeCalendar.props().startDate).toEqual('2022-3-30')
        expect(DateRangeCalendar.props().endDate).toEqual('2022-3-31')
    })
})

When I run the test, the onChangeDateRange is called, but the value of startDate and endDate remain unchanged. It returns as startDate='2022-3-28' endDate='2022-3-29'. Why the value is not changed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文