我有一个应用程序组件负责渲染子输入组件,它也负责通过名为channelSearch
的方法处理对Twitch API的提取请求。我试图遵循建议的最佳实践here与React一起使用ajax/fetch。测试React组件中的fetch()方法
该方法通过道具传递并通过回调调用。
注意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中使用酶和jsdom整个<App>
组件。用回调查找子节点,模拟点击(应该触发回调)并检查组件的状态是否已更改。但是,这似乎并不奏效。
我也尝试过直接调用方法,但是,我遇到了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:
我包括箭扣在意见建议,测试现在看起来是这样的:
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();
});
这似乎仍然没有改变组件的状态。
请包括您的测试,因为它们显然是问题的一部分:) – markthethomas
@markthethomas新增,感谢您的兴趣! –