如何模拟React组件单元测试的request-promise-native?

时间:2018-01-30 14:42:02

标签: reactjs unit-testing mocking jest request-promise

包装:Jest,Enzyme,(和Nock不起作用)。

我有以下React组件:

network_billing <- data.frame( Billing_tree$Source, Billing_tree$Target)
net_billing <- graph_from_data_frame(d=network_billing)
library(cluster)
clusters1 <- clusters(net_billing)$csize
clusters1 <- as.data.frame(clusters1)

我正在尝试为此实现单元测试,因此我想根据结果(import ... const request = require('request-promise-native'); class SomeSearchContainer extends Component { constructor(props) { super(props); this.state = { ... }; }; onResponse = (response) => { const { var1, var2 } = response; if (var1) { this.setState(...) } }; onSubmit = (event) => { const someId = this.props.someId; if (someId.length === 4) { request( { uri: `${location.href}api/${someId}`, json: true, }).then(this.onResponse) .catch(this.props.onResponseError); } else { this.setState(...) } }; render() { return ( <button id="btn-search" onClick={this.onSubmit}>Search</button> ); } } export default SomeSearchContainer; )模拟请求 - promise-native和assert相应更改的阶段。 / p>

理想情况下,我想浅显示组件,模拟点击事件并声明状态已更改(相应地)。

我尝试了各种各样的方法但是我的测试没有等待回来的请求,或者我没有真正模拟请求。

你能告诉我吗?

1 个答案:

答案 0 :(得分:0)

根据this example from the docs,我想想你可能想做类似的事情:

首先,在__mocks__/request-promise-native.js创建一个文件,该文件将模拟您的请求将返回的一些示例数据。这看起来像是:

// __mocks__/request-promise-native.js

const rpn = jest.genMockFromModule('request-promise-native');

const request = opts => new Promise((resolve, reject) => {
  resolve(`{
    var1: true,
    var2: "foo"
  }`);
});

rpn.request = request;

module.exports = rpn;

请注意,__mocks__文件夹需要进入项目的根目录,与node_modules位于同一目录中。

然后您可以像编写任何其他React组件一样编写和运行测试。当测试执行到达通常使用request-promise-native库的部分时,您的模拟版本将自动交换,response变量将获得您在模拟中设置的任何JSON值。

如果您想要稍微复杂的行为,请参阅上面的文档,例如:如果你也想测试reject()的情况。在这种情况下,您可能希望分支opts参数中传递的任何内容,以选择是执行resolve()还是reject()