当前位置: 首页 > 面试题库 >

使用Jest模拟带有道具的React组件

姬昀
2023-03-14
问题内容

我有一个React组件,其中包含一些其他组件,这些组件依赖于对Redux存储等的访问,这会在执行完整的酶安装时引起问题。假设这样的结构:

import ComponentToMock from './ComponentToMock';

<ComponentToTest>
  ...some stuff
  <ComponentToMock testProp="This throws a warning" />
</ComponentToTest>

我想使用Jest的.mock()方法来模拟子组件,因此测试无需担心。

我知道我可以通过以下方式模拟出一个简单的组件:

jest.mock('./ComponentToMock', () => 'ComponentToMock');

但是,由于该组件通常会接收道具,因此React会感到不安,并发出有关将未知道具(在本例中为testProp)传递给的警告<ComponentToMock />

我试图返回一个函数,但是由于悬挂了,所以无法在Jest模拟中返回JSX(据我所知)。在这种情况下会引发错误。

所以我的问题是我怎么能

a)ComponentToMock忽略传递给它的道具,或者

b)返回一个React组件,该组件可用于模拟我不担心测试的子组件。

或者,还有更好的方法?


问题答案:

在文档jest.mock()底部有一条注释,用于防止起吊行为:

注意:使用时babel-jest,对的调用mock将自动提升到代码块的顶部。使用doMock,如果你想明确地避免这种行为。

然后,您可以按照说明进行操作:返回一个函数,该函数是不需要测试的组件的存根。

jest.doMock('./ComponentToMock', () => {
  const ComponentToMock = () => <div />;
  return ComponentToMock;
});

const ComponentToTest = require('./ComponentToTest').default;

命名存根组件很有帮助,因为它会在快照中呈现。



 类似资料:
  • 我正在开发一个React应用程序,我想测试一个模块,我们称之为B,这取决于另一个模块,我们称之为a。 场景可能是这样的: 测试我的组件的核心库是Jest和Ezyme。我的目标是测试模块B,但我想单独测试它,所以我想模拟对模块A的依赖。js。 我知道一种方法是注入helperFn作为道具,而不是导入它,这样在测试期间我就可以注入一个模拟函数,但是这个应用程序上有很大的模块,每个模块都有一些依赖关系。

  • 我正在尝试模拟react bootstrap

  • 我试图为这样的函数编写一个单元测试: 为了测试这段代码,我需要模拟服务,因为它调用类外的函数,但问题是它是私有的。 我该如何用玩笑来模拟一个私有变量呢?这个类创建了它自己的实例,所以甚至可以模仿它吗?

  • 问题内容: 我正在使用ref为组件编写测试。我想模拟ref元素并更改一些属性,但不知道如何做。有什么建议? 问题答案: 根据https://github.com/airbnb/enzyme/issues/1937中的讨论,这就是解决方案 可以使用非箭头函数对类进行猴子修补,其中“ this”关键字将传递到正确的作用域。

  • 问题内容: 我开始认为这是不可能的,但是无论如何我都想问。 我想测试我的一个ES6模块以特定方式调用另一个ES6模块。有了茉莉花,这非常容易- 应用程式码: 和测试代码: 笑话相当于什么?我觉得这是一件很想做的简单的事,但是我一直在努力尝试弄清头发。 我最接近的是将s 替换为s,并将其移入测试/函数中。都不是我想做的事情。 为了获得加分,我希望在其中的功能为默认导出时使整个工作正常进行。但是,我知

  • 问题内容: 因此,我正在从基于类的组件转移到功能组件,但在使用jest / zyme编写功能组件内部的方法(显式使用钩子)编写测试时陷入困境。这是我的代码的精简版。 我知道我可以通过导出来编写测试。但是如何测试或方法呢?如果它是基于类的组件,那么我可以将组件变浅,并从实例中将其用作 但这不适用于功能组件,因为无法以这种方式访问​​内部方法。有什么方法可以访问这些方法,还是应该在测试时将功能组件视为