Javascript 使用酶测试导入到反应组件中的功能

Javascript 使用酶测试导入到反应组件中的功能,javascript,reactjs,enzyme,Javascript,Reactjs,Enzyme,我正试图想出一种方法来测试一个使用辅助函数的组件方法,如下所示: handleUserClick = e => { this.setState({ somePieceOfState: e.target.value }, () => { someHelperFn(e.target.value); }); } 这是一个有点粗糙的例子,但基本上现在我有整个组件的代码覆盖率(Jest),除了调用helper函数的那一行。我看不出将helper函数单独导入测试文件会有什么帮助

我正试图想出一种方法来测试一个使用辅助函数的组件方法,如下所示:

handleUserClick = e => {
  this.setState({ somePieceOfState: e.target.value }, () => {
    someHelperFn(e.target.value);
  });
}
这是一个有点粗糙的例子,但基本上现在我有整个组件的代码覆盖率(Jest),除了调用helper函数的那一行。我看不出将helper函数单独导入测试文件会有什么帮助,所以我被难倒了

编辑:我问这是一个广泛的问题,关于如何测试使用辅助函数的组件,或者是而不是组件方法的函数,不专门针对上面的示例

根据请求,这里详细介绍正在调用的函数:

const someHelperFn = params => {
  const BASE_URL = '/api/public/log-client-event';
  const queryString = generateQueryString(params);
  const logClientRequest = new XMLHttpRequest();
  logClientRequest.open('GET', `${BASE_URL}${queryString}`);
  logClientRequest.send();
  return logClientRequest;
};

它没有返回值。Jest似乎在抱怨,因为它存在于React组件中,并且没有办法实际测试它(据我所知)。

在您提供的示例中,您将模拟XMLHttpRequest。然后,您将测试在调用
handleUserClick
时是否调用了它。这取决于helper函数对如何测试它所做的操作,但它们几乎肯定是一种方法

伊斯坦布尔(不是开玩笑)抱怨,因为您没有实际执行我想象的函数的测试,所以它将其标记为未被任何测试覆盖

这个问题实在太宽泛了,无法得到测试所有辅助函数的明确答案

编辑:


如果您必须测试helper函数,但不能像上面那样在内部测试它,那么您可以作为最后手段,将helper函数模拟成间谍函数,然后检查它是否被调用。不过,我不会默认这样做,因为它可能会变得混乱。

听起来您的测试可能会在回调运行之前退出。您可以先尝试在测试代码中添加一个延迟,看看是否是这种情况。@DanPrince他问的是如何测试辅助函数,我认为这不仅仅是一个回调。为什么它是一个辅助函数很重要?只需测试它的返回值就可以了。很难知道这个最小的代码示例需要什么,因为它是一个助手函数,您也可以在另一个专门针对助手的测试中单独测试它。@MartinDawson您是对的。现在我正在考虑排除伊斯坦布尔的函数调用,因为Jest在引擎盖下面使用伊斯坦布尔。问题是伊斯坦布尔有选择地关闭某些部分的代码有点糟糕。@MartinDawson助手函数(在我的例子中)并没有返回值,只是发出一个跟踪用户交互的请求。公平点。你给了我一个主意,所以现在这应该是一个很好的跳板。谢谢。Fwiw我有时发现函数也很难测试。它是一段必须进行测试的重要代码,还是不值得为其编写测试?100%的测试覆盖率在理想情况下是不错的,但并不总是可行的,尤其是当您必须编写一个非常难看的单元测试时。有趣的是,我将研究它。最初的想法是单独测试helper函数,所以我将坚持这样做,如果只是函数调用,就不必担心完整的代码覆盖率。