【问题标题】:React test state change after timeout超时后反应测试状态变化
【发布时间】:2017-06-24 13:30:25
【问题描述】:

假设我有一个 Card 元素,点击时会翻转。 2秒后,它必须自动翻转回来。在 CSS 术语中,点击后变换样式设置为 rotateY(180deg),2 秒后应变为 Initial

我想为此后空翻编写单元测试(目前测试通过,即使我希望 transform 属性等于初始值):

it( 'flips', () => {
        const testedCard = shallow( <Card /> )
        testedCard.setState( { faceUp: true } )

        setTimeout(
            () => {
                const cardFlipper = testedCard.node.props.children
                expect( cardFlipper.props.transform ).to.equal( 'initdasddaial' )
            },
            2500
        );
    } )

【问题讨论】:

    标签: reactjs settimeout


    【解决方案1】:

    如果您使用的是mochajasmine,则可以在it 中传递done 回调:

    it( 'flips', (done) => {
            const testedCard = shallow( <Card /> )
            testedCard.setState( { faceUp: true } )
    
            setTimeout(
                () => {
                    const cardFlipper = testedCard.node.props.children
                    expect( cardFlipper.props.transform ).to.equal( 'initdasddaial' )
                    done();
                },
                2500
            );
        } )
    

    但是,根据您的测试运行器(设置),done 超时可能会发生在 2500 磨机之前。您可能需要配置不同的超时值。

    附带说明,基于时间的单元测试通常不是一个好主意。考虑设计组件,以便您可以更确定地进行测试。

    【讨论】:

    • 感谢您的提示。试图让它工作。我安装了茉莉花 2.5。每当我使用 setTimeout( ( done ) => { ... }, 1 ) 运行它时,在达到 jasmine.DEFAULT_TIMEOUT_INTERVAL 之前不会调用异步回调。
    • 对我来说,它只有在我安装 jasmine.clock + 超时后使用 jasmine.clock().tick(2000) 后才起作用。我绝对需要获得正确组件设计的经验,但这确实超出了我们在这个问题中的空间。谢谢
    • 很高兴您找到了解决方案! :)
    猜你喜欢
    • 2019-03-08
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 1970-01-01
    • 2018-01-10
    • 2014-08-30
    • 2021-08-09
    • 2021-06-03
    相关资源
    最近更新 更多