热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

九、快照测试

九、快照测试到目前为止,您已经了解了如何测试Vue.js组件的结构、样式、方法、计算属性、事

九、快照测试

到目前为止,您已经了解了如何测试 Vue.js 组件的结构、样式、方法、计算属性、事件、观察者等。通过使用各种技术和方法,您已经学会了如何做到这一点。

但是,如果我告诉您,您可以通过简单地使用快照测试来测试其中的大部分内容,该怎么办?

您已经在第 1 章中看到了快照测试的使用,在第 2 章中编写了第一个 Vue.js 组件单元测试,测试深入渲染了 Vue.js 组件,但这些章节更多地侧重于解释浅渲染和深渲染,所以我还没有详细解释。

快照测试是通过比较两个不同的输出来断言的技术。

可以将其视为类似于端到端测试中用于检查回归的屏幕截图技术:第一次测试运行将截取屏幕的一部分(例如,一个按钮),从那一刻起,相同测试的所有后续运行将比较新屏幕截图和原始屏幕截图。如果它们相同,则测试通过;否则,就会出现倒退。

快照测试以同样的方式工作,但它不是比较图像,而是比较可序列化的输出,例如 JSON 和 HTML,或者只是比较字符串。

由于 Vue.js 呈现 HTML,因此可以使用快照测试在给定组件不同状态的情况下断言呈现的 HTML。

快照中的反思

对于这个例子,让我们考虑下面的 To0T0.组件:



在这种情况下,我们可以测试该组件的几个方面:


  • fullNamename+surname的组合。

  • 当选择组件时,它有一个selected类。

  • 它发出一个contact-click事件。

创建验证这些规范的测试的一种方法是分别检查所有内容——附加到 DOM 元素的类、HTML 结构、计算属性和状态。

正如您在其他章节中所看到的,您可以按如下方式执行这些测试:

import { mount } from "vue-test-utils";
import ContactBox from "../src/components/ContactBox";
const createCOntactBox= (id, name, surname, selected) =>
mount(ContactBox, {
propsData: { id, name, surname, selected }
});
describe("ContactBox.test.js", () => {
it("fullName should be the combination of name + surname", () => {
const cmp = createContactBox(0, "John", "Doe", false);
expect(cmp.vm.fullName).toBe("John Doe");
});
it("should have a selected class when the selected prop is true", () => {
const cmp = createContactBox(0, "John", "Doe", true);
expect(cmp.classes()).toContain("selected");
});
it("should emit a contact-click event with its id when the component is clicked", () => {
const cmp = createContactBox(0, "John", "Doe", false);
cmp.trigger("click");
const payload = cmp.emitted("contact-click")[0][0];
expect(payload).toBe(0);
});
});

但是现在,让我们考虑一下快照测试在这方面可以如何帮助我们。

如果仔细考虑,组件将根据其状态进行渲染。我们将其称为呈现状态

使用快照测试,我们可以检查呈现状态,因为这是组件状态的投影结果,而不用担心检查特定的东西,例如属性、类、方法和计算属性。

为此,您可以对上一个测试使用快照测试,如下所示:

it("fullName should be the combination of name + surname", () => {
const cmp = createContactBox(0, "John", "Doe", false);
expect(cmp.element).toMatchSnapshot();
});

正如您所看到的,我现在不是单独检查,而是断言cmp.element的快照,这是组件的呈现 HTML。

如果您现在运行测试套件,那么应该已经创建了一个ContactBox.test.js.snap文件,并且您还会在控制台输出中看到一条消息:

Figure 9.1

图 9.1

让我们分析生成的快照:

// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[
`ContactBox.test.js fullName should be the combination of name + surname 1`
] = `
class=""
>


John Doe



`;

此测试的目的是检查计算属性fullName是否同时包含名称和姓氏,并用空格分隔。看快照,你可以看到这是正在发生的,并且某个身份不明的人 Ty2 T2 的 T1 是存在的,所以你可以认为这个测试是有效的。

同样,您可以使用快照测试编写第二个测试:

it("should have a selected class when the selected prop is true", () => {
const cmp = createContactBox(0, "John", "Doe", true);
expect(cmp.element).toMatchSnapshot();
});

请注意,此测试与上一个测试之间唯一的变化是将selected属性设置为true

这就是快照测试的威力:您可以使用组件的不同状态,而您只需要断言呈现状态。

本测试的目的是验证当属性为true时它是否有selected类。现在,让我们再次运行测试套件,如果您再次检查ContactBox.test.js.snap,您将看到添加了另一个快照:

exports[
`ContactBox.test.js should have a selected class when the selected prop is true 1`
] = `
class="selected"
>


John Doe



`;

正如预期的那样,所选的类是存在的,因此我们可以认为这一类也是有效的。

当快照测试没有帮助时

你有没有注意到我没有提到第三次考试的事?要回忆此测试,让我们再次检查它:

it("should emit a contact-click with its id when the component is clicked", () => {
const cmp = createContactBox(0, "John", "Doe", false);
cmp.trigger("click");
const payload = cmp.emitted("contact-click")[0][0];
expect(payload).toBe(0);
});

在这种情况下,单击组件时,它不会执行任何更改组件状态的操作,这意味着渲染状态不会更改。我们只是测试对组件渲染没有影响的行为。

因此,我们可以说,快照测试对于检查呈现状态中的更改非常有用。如果渲染状态不变,快照测试将无法帮助我们。

当测试失败时

在决定测试是否有效时,生成的快照是事实的来源。这就是检验回归的方法,最终取决于你的标准。

例如,转到ContactBox.vue组件并将fullName计算属性更改为以逗号分隔:

fullName() {
return `${this.name}, ${this.surname}`;
}

如果再次运行测试,其中一些测试将失败,因为渲染结果与以前不同。您将得到以下错误:

Received value does not match stored snapshot 1.
- Snapshot
+ Received
class=""
>


- John Doe
+ John, Doe



从这一点开始,因为这通常与测试有关,您必须决定这是有意的改变还是回归。您可以按‘u’更新快照:

Figure 9.2

图 9.2

应用 TDD 使用手表模式npm run test -- --watch时会很方便。这将非常方便,因为 Jest 为您提供了许多更新快照的选项:


结论

快照测试为您节省了大量时间。这个 example 是基本的,但是想象一下测试一个具有许多不同渲染状态的更复杂组件。。。

当然,您可以针对特定事物进行断言,但这比根据状态断言组件的呈现方式要麻烦得多,因为大多数情况下,如果更改代码,您必须更改与测试相关的断言,而对于快照测试,您不需要这样做。

另外,你可以找到回归你没有考虑到的回归,也许是你在测试中没有考虑到的东西,或者改变了组件渲染的东西,但是快照会提醒你。

我现在想提一提您应该记住的几个注意事项

如果您想亲自尝试,您可以在GitHub(上找到本章中使用的完整示例 https://github.com/alexjoverm/vue-testing-series/tree/chapter-9 )。


推荐阅读
author-avatar
itbases
这个家伙很懒,什么也没留下!
Tags | 热门标签
RankList | 热门文章
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有