首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用不带require jest单元测试的jQuery的React组件

问使用不带require jest单元测试的jQuery的React组件
EN

Stack Overflow用户
提问于 2014-11-28 21:01:40
回答 3查看 11.5K关注 0票数 9

我有一个非常简单的React mixin,它使用jQuery来触发事件

代码语言:javascript
复制
MyMixin = {
  trackStructEvent: function () {
    args = Array.prototype.slice.call(arguments);
    $('body').trigger('myEvent', args);
  }
module.exports = MyMixin

这将作为使用browserify的一组新组件的一部分导入到主站点。由于包含这些组件的主站点将始终包含jQuery,因此我不希望在browserify中使用jQuery,因为它将被复制。

就行为而言,这不是问题--然而,当运行jest来使用这个混入对组件进行单元测试时,它会引发问题,抛出错误。

代码语言:javascript
复制
ReferenceError: $ is not defined

我知道我可以通过browserify包含jQuery来修复这个问题,但这会将2个副本加载到我的站点中。

在jest中,有没有办法告诉我的react组件jQuery已经存在于窗口中,而不用担心呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-07-01 20:55:53

我也有类似的问题,但我认为到目前为止我已经解决了你的问题。您需要在react文件中使用require来定义$下的jQuery

代码语言:javascript
复制
var $ = require('jquery');

MyMixin = {
   trackStructEvent: function () {
      args = Array.prototype.slice.call(arguments);
      $('body').trigger('myEvent', args);
   }
module.exports = MyMixin

然后,您需要告诉jest不要模仿jquery

代码语言:javascript
复制
jest.dontMock('jquery')

然后你的jest单元测试应该会通过(假设它们没有验证jQuery正在做的事情--这就是我的测试失败的地方)。

您还需要告诉browserify jQuery是外部的,那么结果将是您对$的所有引用都已定义,jquery库已加载以进行测试,但并未包含在您的browserify包中。(使用browserify-shim)

票数 7
EN

Stack Overflow用户

发布于 2016-08-12 03:10:42

我要说的是:

if (process.env.NODE_ENV === 'test') window.$ = require('jquery');

我希望这对某些人有帮助!

更新:

我已经开始在所有使用jQuery的React文件中使用import $ from 'jquery'。这消除了对Windows.$的依赖,因为它是我期望的jQuery类型(我在处理Windows.$时遇到了其他库的问题。一开始,我很担心在任何地方导入jQuery,因为我担心这会增加我的包大小。但是捆绑的工作方式是,所有这些导入都指向一个单例,因此捆绑的大小不会增加。

票数 2
EN

Stack Overflow用户

发布于 2016-12-09 02:28:47

就我而言,我对在我的组件中测试jQuery功能不感兴趣。此外,我没有在我的捆绑包中包含jQuery,因为我的应用程序所在的网站上到处都在使用和包含它。因此,举个例子,我做了以下工作:

代码语言:javascript
复制
// SubmitRender.js

// ...import statements...

var SubmitRender = React.createClass({
  componentWillMount: function () {
    $('form').on('submit', (e)=>{
      this.handleSubmit(e);
    });
  },

  // ...more code...
});
export default SubmitRender;

。

代码语言:javascript
复制
// SubmitRender.spec.js

// ...import statements...

describe('SubmitRender', () => {
  beforeAll(() => {
    // mocking jQuery $()
    global.window.$ = jest.fn(() => {return {on: jest.fn()}});
  });

  it('renders without error', () => {
    expect( () => render(<SubmitRender />) ).not.toThrow();
  });
});

我知道如果不调用$函数,我的组件将无法挂载。所以我只是在beforeAll()中用jest.fn模拟了这个函数。现在,我还知道我的实际组件中的jQuery函数是链式的。因此,我知道我还需要考虑jQuery的.on(),因此我确保使用on函数返回一个对象。没有更多的链接,所以这就是我要说的。

如果我有一组更复杂的链式函数,我可以这样做:

代码语言:javascript
复制
beforeAll(() => {
  // mocking jQuery $()
  var fakeQuery = jest.fn(() => {
    return {
      on: fakeQuery,
      off: fakeQuery,
      click: fakeQuery
    }
  })
  global.window.$ = fakeQuery;
});
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27189254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档