【发布时间】:2018-01-08 16:42:31
【问题描述】:
我是 Jest/React 初学者。在开玩笑的it 中,我需要等到所有承诺都执行完毕后再进行实际检查。
我的代码是这样的:
export class MyComponent extends Component {
constructor(props) {
super(props);
this.state = { /* Some state */ };
}
componentDidMount() {
fetch(some_url)
.then(response => response.json())
.then(json => this.setState(some_state);
}
render() {
// Do some rendering based on the state
}
}
当组件被挂载时,render() 运行两次:一次在构造函数运行之后,一次在fetch()(在componentDidMount())完成并且链式 Promise 完成执行之后。
我的测试代码是这样的:
describe('MyComponent', () => {
fetchMock.get('*', some_response);
it('renders something', () => {
let wrapper = mount(<MyComponent />);
expect(wrapper.find(...)).to.have.something();
};
}
无论我从it 返回什么,它都会在render() 第一次执行之后但第二次之前运行。例如,如果我返回 fetchMock.flush().then(() => expect(...)),则返回的 Promise 在第二次调用 render() 之前执行(我相信我能理解为什么)。
如何等到第二次调用 render() 后再运行 expect()?
【问题讨论】:
-
在我看来,您试图在一次测试中测试太多东西。您要测试的是,您的 fetch 函数在组件挂载时被调用,然后您有多个其他测试将状态显式传递给它们,您可以检查组件是否正确呈现。
-
@MattWatson 如果我检查 (1) 是否调用了 fetch 函数并且 (2) 是否正确传递了状态,那么我无法检查 (1.5) 状态是否设置正确。如何检查状态是否设置正确?
标签: reactjs jestjs fetch-api jest-fetch-mock