14

组件.js

import React from 'react'
import request from 'superagent'

export default React.createClass({
    getInitialState() {
        return {cats: []}
    },

    componentDidMount() {
        request('/api', (err, res) => {
            if (err) return;
            this.setState({
                cats: res.body.results
            })
        })
    },

    render() {
        let cats = this.state.cats
        let catsList = (
            <ul>
                {cats.map((c) => <li key={c.id}>cat</li>)}
            </ul>
        )
        return (
            <div>
                {cats.length ? catsList : null}
            </div>
        )
    }
})

组件.test.js

jest.unmock('../app.js')
jest.unmock('superagent')

import React from 'react'
import {mount} from 'enzyme'
import nock from 'nock'
import App from '../app.js'

describe('App', () => {
    let ajaxFn
    beforeEach(() => {
        ajaxFn = nock('http://localhost')
            .get('/api')
            .reply(200, {
                results: [{id: 1}, {id: 2}, {id: 3}]
            })
    })

    it('renders correct number of cats', () => {
        let wrapper = mount(<App />)
        expect(wrapper.state('cats').length).toBe(3)
    })
})

测试没有通过。wrapper.state('cats').length总是0

我知道这setState不能保证立即更新状态,但是如果我在组件中记录“猫”,我可以看到它正在更新。

4

3 回答 3

10

如果您最终在酶不知道的某些上下文中在组件中设置状态,则必须手动调用.update()包装器以使其获取渲染树的更新版本。

it('renders correct number of cats', () => {
    let wrapper = mount(<App />)
    expect(wrapper.update().state('cats').length).toBe(3)
})
于 2016-03-11T01:12:39.200 回答
2

it我遇到了类似的问题,有必要从回调中返回一个Promise 并检查 Promisethen方法中的期望。

在你的情况下(假设 ajaxFn 是一个承诺,或者你可以把它变成一个)我认为这大约是:

it('renders correct number of cats', () => {
    let wrapper = mount(<App />) 
    return ajaxFn.then(() => {
        expect(wrapper.state('cats').length).toBe(3);
    }
})
于 2016-11-03T00:18:33.197 回答
0

我不熟悉您使用的所有库,但由于您的代码是异步执行的,因此测试在状态更新之前完成。我可以通过在测试中添加 async/await 来解决这个问题:

it('renders correct number of cats', async () => {
    let wrapper = await mount(<App />)
    expect(wrapper.state('cats').length).toBe(3)
})
于 2018-06-17T19:12:32.110 回答