javascript - karma -Jquery : How to Get Client Side Jquery Code to Work in Karma Tests?

标签 javascript jquery reactjs testing karma-runner

我有一个问题,我似乎找不到解决方案。

我有一个 React 组件,它使用 jquery 根据单击事件更改某些 DOM 节点的类,如下所示(简化版):

hide() {
  if ($('.hidecontrols').hasClass('fa-arrow-left')) {
    //hide UI
    $('.hidecontrols').removeClass('fa-arrow-left');
    $('.hidecontrols').addClass('fa-arrow-right');
  } else {
    //show UI
    $('.hidecontrols').removeClass('fa-arrow-right');
    $('.hidecontrols').addClass('fa-arrow-left');
  }
}
render() {
  return (
    <div>
      <i onClick={this.hide} className="hidecontrols fa fa-2x fa-arrow-left" aria-hidden="true"/>
    </div>
  );
}

当我在浏览器中测试代码时,它工作正常。当我用这个测试运行 Karma 时:

it('should HIDE when the hide-arrow is clicked', () => {
  var store = configure({});
  var provider = ReactTestUtils.renderIntoDocument(
    <Provider store={store}><Controls/></Provider>
  );

  var controls = ReactTestUtils.scryRenderedComponentsWithType(provider, Controls)[0];
  var hideArrow = ReactTestUtils.scryRenderedDOMComponentsWithClass(controls, 'fa-arrow-left')[0];

  ReactTestUtils
    .Simulate
    .click(hideArrow);

  var unHideArrow = ReactTestUtils.scryRenderedDOMComponentsWithClass(controls, 'fa-arrow-right')[0];

  expect(unHideArrow).toExist();
});

测试失败。 this.hide() 是在模拟点击时调用的,但是

if($('.hidecontrols').hasClass('fa-arrow-left'))

失败,因为 jquery 无法看到 renderIntoDocument 呈现的任何元素。

长话短说,jquery 是在 Karma 浏览器的全局上下文中调用的(我使用的是 chrome,这并不重要),而不是在我的 React 组件已呈现的任何上下文中。

有什么想法可以让 jquery 在正确的上下文中被调用,以便它可以实际看到它应该选择的节点吗?我从搜索中发现的任何东西似乎都无法解决这个问题。

最佳答案

如果你想避免测试失败,你应该模拟 jQuery。

spyOn(window, 'jQuery').returns($('<div>'))
spyOn(jQuery.fn, 'hasClass').returns({something})

如果您想正确测试这段代码,您不应该尝试进行端到端测试。不要在测试中编写复杂的场景。例如:

测试#1: 检查“...应该创建对象”

测试#2: 选中“点击时应调用方法隐藏”

测试#3: 检查“函数隐藏应该调用一些 jQuery 方法”

您将更快地获得结果,并且测试将更有支持性

关于javascript - karma -Jquery : How to Get Client Side Jquery Code to Work in Karma Tests?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41354812/

相关文章:

javascript - 自执行匿名函数语法

javascript - 在另一个 div 内移动和限制一个 div 的运动

如果 Enter 键按下,jQuery 调用函数

javascript - `$xml = $( xmlDoc )` 是做什么的?

javascript - 如何让其他按钮功能在单击按钮时自动运行

javascript - 当我单击它们然后将该数据传递到我的变量时如何获取特定树节点的 ID

javascript - 我们可以为 &lt;input type=file/> 设置一个值吗?如果是,请告诉我们如何设置

javascript - 无法使用 jQuery 和 AJAX 发送 POST 请求

javascript - react CKeditor Jest 错误 : SyntaxError: Cannot use import statement outside a module

javascript - React props.children 在第一次状态更改后不会重新渲染