我有一个 App 组件负责渲染子输入组件,它还负责通过名为channelSearch
. 我已尝试遵守此处概述的建议的最佳实践,以使用 React 使用 ajax/fetch。
该方法通过 props 向下传递并通过回调调用。
注意 fetch 方法实际上是 isomorphic-fetch。
channelSearch (searchReq, baseUrl="https://api.twitch.tv/kraken/channels/") {
fetch(baseUrl + searchReq)
.then(response => {
return response.json();
})
.then(json => {
this.setState({newChannel:json});
})
.then( () => {
if (!("error" in this.state.newChannel) && this.channelChecker(this.state.newChannel._id, this.state.channelList) ) {
this.setState(
{channelList: this.state.channelList.concat([this.state.newChannel])}
);
}
})
.catch(error => {
return error;
});
}
我目前正在尝试为该channelSearch
方法编写测试。我目前正在对 DOM 中mount
的整个<App>
组件使用酶和 jsdom。找到带有回调的子节点,模拟单击(应该触发回调)并检查组件的状态是否已更改。但是,这似乎不起作用。
我也尝试过直接调用该方法,但是,我遇到了this.state
未定义的问题。
test('channel search method should change newChannel state', t => {
const wrapper = mount(React.createElement(App));
wrapper.find('input').get(0).value = "test";
console.log(wrapper.find('input').get(0).value);
wrapper.find('input').simulate("change");
wrapper.find('button').simulate("click");
console.log(wrapper.state(["newChannel"]));
});
我真的迷路了,我不确定方法本身是否写得不好,或者我没有使用正确的工具来完成这项工作。任何指导将不胜感激。
更新#1:
我按照评论中的建议包含了 nock,现在测试看起来像这样:
test('channel search method should change newChannel state', t => {
// Test object setup
var twitch = nock('https://api.twitch.tv')
.log(console.log)
.get('/kraken/channels/test')
.reply(200, {
_id: '001',
name: 'test',
game: 'testGame'
});
function checker() {
if(twitch.isDone()) {
console.log("Done!");
console.log(wrapper.state(["newChannel"]));
}
else {
checker();
}
}
const wrapper = mount(React.createElement(App));
wrapper.find('input').get(0).value = "test";
wrapper.find('input').simulate("change");
wrapper.find('button').simulate("click");
checker();
});
这似乎仍然没有改变组件的状态。