【全栈React】第23天: 实现测试

本文转载自:众成翻译
译者:iOSDevLog
链接:http://www.zcfy.cc/article/3807
原文:https://www.fullstackreact.com/30-days-of-react/day-23/

昨天我们检查了我们在React中写的不同类型的测试。今天我们亲自动手来看看结果。我们将安装设置测试所需的依赖关系以及写入我们的第一个断言。

让我们把我们的应用设置起来进行测试。因为我们将使用几个不同的库,所以我们需要在使用它们之前安装它们 (当然)。

依赖关系

我们将使用下面的npm 库:

jest/jest-cli

是 Facebook 发布的官方测试框架,是测试React应用的绝佳测试框架。它非常快,提供沙盒测试环境,支持快照测试,等等。

babel-jest/babel-preset-stage-0

我们将使用阶段 0 (或 ES6-edge 功能) 编写测试,因此我们希望确保我们的测试框架能够读取和处理我们的测试和源文件中的 ES6。

sinon

Sinon是一个测试实用程序库,它为我们提供了一种编写间谍(spies)、存根(stubs)和 模拟(mock) 的方法。我们将在需要时讨论这些内容,但现在我们将安装该库。

react-addons-test-utils/enzyme

react-addons-test-utils 包包含由React团队提供的测试实用程序。

Enzyme是由 Airbnb 构建/维护的 更易于使用的JavaScript 测试库,并且提供了遍历/操纵响应的虚拟 DOM 输出的非常好的方法。当我们开始使用react-addons-test-utils,我们将过渡到使用Enzyme,我们更喜欢在我们的测试中使用它。

react-test-renderer

react-test-renderer 库允许我们使用jest库中的快照功能。快照是一种Jest的方式,可将呈现的输出从虚拟 DOM 序列化为一个文件,我们可以从一个测试自动进行比较。

redux-mock-store

redux-mock-store库允许我们轻松地制作一个再现存储进行测试。我们将使用它来测试我们的动作创创建者,中间件,和我们的归并器。

To install all of these libraries,we'll use the following npm command in the terminal while in the root directory of our projects:要安装所有这些库,我们将在项目的根目录中使用终端中的npm 命令:

yarn add --dev babel-jest babel-preset-stage-0 enzyme jest-cli react-addons-test-utils react-test-renderer redux-mock-store sinon

配置

我们还需要配置我们的安装程序。首先,让我们添加一个 npm 脚本,它将允许我们使用npm test 命令运行测试。在我们的项目根目录的package.json 文件,让我们添加test 脚本。在package.json文件中查找脚本键,然后添加test 命令,如下所示:

{
  // ...
  "scripts": {
    "start": "react-scripts start","build": "react-scripts build","eject": "react-scripts eject","test": "react-scripts test --env=jsdom"
  },}

编写测试

让我们确认我们的测试设置工作正常。Jest将在一个名为__tests__ 的目录中自动查找整个树中的测试文件 (是的,带有下划线)。让我们在我们的src/components/Timeline 目录中创建我们的第一个__tests__ 目录,并创建我们的第一个测试文件:

mkdir src/components/Timeline/__tests__
touch src/components/Timeline/__tests__/Timeline-test.js

Timeline-test.js文件将包括我们的Timeline组件的所有测试 (如文件名所示)。让我们为时间轴组件创建第一个测试。

我们将使用 Jasmine框架编写测试。Jasmine提供了一些方法,我们将使用相当多的一些方法。以下两种方法都接受两个参数,第一种是描述字符串,第二个是要执行的函数:

  • describe()

  • it()

describe() 函数为我们提供了一种将测试组合成逻辑包的方法。由于我们正在为我们的Timeline编写一组测试,我们将在测试中使用describe() 函数来指示我们正在测试时间轴。

src/components/Timeline/__tests__/Timeline-test.js文件中,让我们添加描述块:

describe('Timeline',() => {

});

我们可以使用it() 函数添加第一个测试。it() 函数是我们将设定预期的位置。让我们用我们的第一个期望,一个通过和一个失败来设置我们的测试,这样我们可以看到输出的差异。

In the same file,let's add two tests:在同一个文件中,让我们添加两个测试:

describe('Timeline',() => {

  it('passing test',() => {
    expect(true).toBeTruthy();
  })

  it('failing test',() => {
    expect(false).toBeTruthy();
  })
})

我们将看看可能的期望,我们可以设定在一个时刻。首先,让我们运行我们的测试。

执行测试

create-react-app 包 使用Jest自动为我们建立了一个质量测试环境,。我们可以使用yarn testnpm test脚本执行测试。

在终端中,让我们执行我们的测试:

yarn test

从这个输出,我们可以看到两个测试,一个通过测试 (带有一个绿色的复选标记) 和一个失败的测试 (还有一个红色的 x 和失败的描述)。

让我们更新第二个测试,使它通过将期望更改为toBeFalsy():

describe('Timeline',() => {
    expect(false).toBeTruthy();
  })
})

重新运行测试,我们可以看到我们有两个通过测试

`yarn test`

期望

在默认情况下,Jest在测试中提供了一些全局命令 (即没必要要求的内容)。其中之一是expect() 命令。expect() 命令有几个期望,我们可以调用它,包括我们已经使用的两个:

  • toBeTruthy()

  • toBeFalsy()

  • toBe()

  • toEqual()

  • toBeDefined()

  • toBeCalled()

  • etc.

在以下的 jest页面中可以获得一整套期望:https://facebook.github.io/jest/docs/api.html#writing-assertions-with-expect.

expect() 函数采用单个参数: 返回要测试的值函数的返回值。例如,我们已经写好的两个测试通过了truefalse的布尔值。

现在我们已经编写了第一个测试并确认了我们的设置,我们将在明天开始测试我们的时间轴组件。今天的工作很好,明天见!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom