欢呼声
清晰显示差异,以便人们可以自信地审查变化.
这个 diff 命名导出序列化 JavaScript 数值,然后返回包含比较线的字符串.
比较两个命名的出口 字符串 逐个字符 :
diffStringsUnified返回字符串.diffStringsRaw返回数组Diff对象.
3个出口名称比较 字符串数组 按行数 :
diffLinesUnified财务报告和审定财务报表diffLinesUnified2返回字符串.diffLinesRaw返回数组Diff对象.
安装
要添加此软件包作为工程的依赖, 请运行以下任一命令 :
npm install jest-diffyarn add jest-diff
使用时间 diff()
给定 Java 脚本 数值, (中文(简体) ), diff(a, b, options?) 执行下列规定:
- 序列化 使用
pretty-format软件包 - 比较 使用
diff-sequences软件包 - 格式 使用
chalk软件包
要使用此函数,请写出以下任一部分:
const {diff} = require('jest-diff');在共同JS模块中import {diff} from 'jest-diff';在ECMAScript模块中
实例 diff()
const a = ['delete', 'common', 'changed from'];
const b = ['common', 'changed to', 'insert'];
const difference = diff(a, b);
回来的 字符串 包括:
- 注释行: 描述两个带有标签的更改指标, 和一个空白行
- 比较线:类似于GitHub上的“统一”观点,但
Expected线路是绿色的,Received行为红色,常见行为暗色(默认情况下,见选项)
- Expected
+ Received
Array [
- "delete",
"common",
- "changed from",
+ "changed to",
+ "insert",
]
边际案件 diff()
以下是返回值的边框:
' Comparing two different types of values. …'如果争论有 不同类型 根据jest-get-type软件包(不同类别的软件包有相同的'object'类型)'Compared values have no visual difference.'如果这些论点有 优惠身份 根据Object.is方法或 相同的序列化 根据pretty-format软件包null如果这两个论点都是所谓的 非对称匹配者 在茉莉花或欢乐
使用 diffStrings 统一
鉴于 字符串, (中文(简体) ), diffStringsUnified(a, b, options?) 执行下列规定:
- 比较 使用
diff-sequences软件包 - 清理 小(常为偶发)常见的下弦,又名相花
- 格式 使用
chalk软件包
虽然这个功能主要用于 多线 字符串,可以比较任意字符串.
写以下任一:
const {diffStringsUnified} = require('jest-diff');在共同JS模块中import {diffStringsUnified} from 'jest-diff';在ECMAScript模块中
DiffStrings 实例
const a = 'common\nchanged from';
const b = 'common\nchanged to';
const difference = diffStringsUnified(a, b);
回来的 字符串 包括:
- 注释行: 描述两个带有标签的更改指标, 和一个空白行
- 比较线:类似于GitHub上的“统一”观点,以及 更改子字符串 有过 反转 前景和背景颜色(即,
from有白绿相间to有正对正对正红,以下示例未显示)
- Expected
+ Received
common
- changed from
+ changed to
DiffStrings的性能统一
获得好处 更改子字符串 在比较行内,逐个字符比较的计算成本(时间和空间)高于逐行比较.
如果输入字符串可以 任意长度,我们建议调用代码设定一个限制, 超过这个限制,再分弦,然后调用 diffLinesUnified 换句话说 例如,Jest如果任意一个字符串的长度大于20K字符,则会回落到逐行比较.
单行道的使用
鉴于 字符串数组, (中文(简体) ), diffLinesUnified(aLines, bLines, options?) 执行下列规定:
- 比较 使用
diff-sequences软件包 - 格式 使用
chalk软件包
当字符串被分割成行而不需要在行内看到已更改的子字符串时,您可能会调用此函数 .
单行线示例
const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];
const difference = diffLinesUnified(aLines, bLines);
- Expected
+ Received
- delete
common
- changed from
+ changed to
+ insert
DiffLines的边缘病例 统一或diffStrings
以下是参数和返回值的边缘实例:
- 两者
a财务报告和审定财务报表b是空字符串:没有比较线 - 仅限
a是空字符串: 所有比较行都有bColor财务报告和审定财务报表bIndicator(见选项) - 仅限
b是空字符串: 所有比较行都有aColor财务报告和审定财务报表aIndicator(见选项) a财务报告和审定财务报表b等同非空字符串: 所有比较线都有commonColor财务报告和审定财务报表commonIndicator(见选项)
DiffLine 统一使用 2
两个 双对 数组弦, diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options?) 执行下列规定:
- 比较 一对
Compare使用diff-sequences软件包 - 格式 组合中的对应行
Display使用chalk软件包
Jest称,如果唯一的区别是缩进,则将此函数视为通行而非更改.
您可以将此函数称为大小写不敏感或Unicode等同的行比较 .
DiffLine 实例统一2
import {format} from 'pretty-format';
const a = {
text: 'Ignore indentation in serialized object',
time: '2019-09-19T12:34:56.000Z',
type: 'CREATE_ITEM',
};
const b = {
payload: {
text: 'Ignore indentation in serialized object',
time: '2019-09-19T12:34:56.000Z',
},
type: 'CREATE_ITEM',
};
const difference = diffLinesUnified2(
// serialize with indentation to display lines
format(a).split('\n'),
format(b).split('\n'),
// serialize without indentation to compare lines
format(a, {indent: 0}).split('\n'),
format(b, {indent: 0}).split('\n'),
);
这个 text 财务报告和审定财务报表 time 属性是常见的,因为他们唯一的区别是缩进:
- Expected
+ Received
Object {
+ payload: Object {
text: 'Ignore indentation in serialized object',
time: '2019-09-19T12:34:56.000Z',
+ },
type: 'CREATE_ITEM',
}
前面的例子说明了为什么(至少对于缩进来说)函数返回来自 bLinesDisplay 数组而不是从 aLinesDisplay 阵列.
DiffStringsRaw 的使用法
鉴于 字符串 和布尔的选项, diffStringsRaw(a, b, cleanup) 执行下列规定:
- 比较 使用
diff-sequences软件包 - 可选择 清理 小(常为偶发)常见的下弦,又名相花
因为 diffStringsRaw 返回差数为 数据 而不是字符串,您可以按应用程序的要求格式化它(例如,在浏览器的HTML标记上加注,而不是在控制台的逃生序列上加注).
回来的 数组 将子字符串描述为 Diff 类,该类的调用代码可以像数组拖动一样访问:
指数值 0 属于下列情况之一:
| 价值 | 命名导出 | 说明 |
|---|---|---|
0 | DIFF_EQUAL | 内 a 内 b |
-1 | DIFF_DELETE | 内 a 但没有在 b |
1 | DIFF_INSERT | 内 b 但没有在 a |
指数值 1 是一个子串 a 或者说 b 或两者兼有.
有清理的 diffStringsRaw 示例
const diffs = diffStringsRaw('changed from', 'changed to', true);
i | diffs[i][0] | diffs[i][1] |
|---|---|---|
0 | 0 | 'changed ' |
1 | -1 | 'from' |
2 | 1 | 'to' |
未清理的 diffStringsRaw 示例
const diffs = diffStringsRaw('changed from', 'changed to', false);
i | diffs[i][0] | diffs[i][1] |
|---|---|---|
0 | 0 | 'changed ' |
1 | -1 | 'fr' |
2 | 1 | 't' |
3 | 0 | 'o' |
4 | -1 | 'm' |
DiffStringsRaw 高级导入
这是所有你可能需要的商品 diffStringsRaw 函数 :
const {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} = require('jest-diff');在共同JS模块中import {DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT, Diff, diffStringsRaw} from 'jest-diff';在ECMAScript模块中
写一个 格式化 函数,您可能需要命名常数(和 Diff 在 TypeScript 说明中.
如果您写入了应用程序 清理 算法,那么你可能需要调用 Diff 构造器 :
const diffCommon = new Diff(DIFF_EQUAL, 'changed ');
const diffDelete = new Diff(DIFF_DELETE, 'from');
const diffInsert = new Diff(DIFF_INSERT, 'to');
DiffLinesRaw的使用量
鉴于 字符串数组, (中文(简体) ), diffLinesRaw(aLines, bLines) 执行下列规定:
- 比较 使用
diff-sequences软件包
因为 diffLinesRaw 返回差数为 数据 而不是字符串,您可以根据应用程序的要求格式化它.
DiffLineRaw 实例
const aLines = ['delete', 'common', 'changed from'];
const bLines = ['common', 'changed to', 'insert'];
const diffs = diffLinesRaw(aLines, bLines);
i | diffs[i][0] | diffs[i][1] |
|---|---|---|
0 | -1 | 'delete' |
1 | 0 | 'common' |
2 | -1 | 'changed from' |
3 | 1 | 'changed to' |
4 | 1 | 'insert' |
DiffLinesRaw 边缘案例
如果你打电话 string.split('\n') 用于空字符串 :
- 结果
['']包含空字符串的数组 - 改为
[]空数组
根据申请,你可能会打电话 diffLinesRaw 使用任意一个阵列.
拆分方法示例
import {diffLinesRaw} from 'jest-diff';
const a = 'non-empty string';
const b = '';
const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
i | diffs[i][0] | diffs[i][1] |
|---|---|---|
0 | -1 | 'non-empty string' |
1 | 1 | '' |
您可以格式化如下:
- Expected - 1
+ Received + 1
- non-empty string
+
拆分Lines0 函数示例
对于边缘案件的行为,如 diffLinesUnified 函数,您可以定义 splitLines0 函数,该函数给出了空字符串,返回 [] 空数组 :
export const splitLines0 = string =>
string.length === 0 ? [] : string.split('\n');
import {diffLinesRaw} from 'jest-diff';
const a = '';
const b = 'line 1\nline 2\nline 3';
const diffs = diffLinesRaw(a.split('\n'), b.split('\n'));
i | diffs[i][0] | diffs[i][1] |
|---|---|---|
0 | 1 | 'line 1' |
1 | 1 | 'line 2' |
2 | 1 | 'line 3' |
您可以格式化如下:
- Expected - 0
+ Received + 3
+ line 1
+ line 2
+ line 3
相对于 diffLinesRaw 函数 diffLinesUnified 财务报告和审定财务报表 diffLinesUnified2 函数 自动 转换由字符串计算的数组参数 split 方法,所以呼叫者这样做 没有 需要一个 splitLine0 函数.
选项
默认选项是当断言失败时的报表 expect jest 使用的软件包.
对于其他应用程序,您可以提供一个选项对象作为第三个参数:
diff(a, b, options)diffStringsUnified(a, b, options)diffLinesUnified(aLines, bLines, options)diffLinesUnified2(aLinesDisplay, bLinesDisplay, aLinesCompare, bLinesCompare, options)
选项对象的属性
| 名称 | 默认 |
|---|---|
aAnnotation | 'Expected' |
aColor | chalk.green |
aIndicator | '-' |
bAnnotation | 'Received' |
bColor | chalk.red |
bIndicator | '+' |
changeColor | chalk.inverse |
changeLineTrailingSpaceColor | string => string |
commonColor | chalk.dim |
commonIndicator | ' ' |
commonLineTrailingSpaceColor | string => string |
compareKeys | undefined |
contextLines | 5 |
emptyFirstOrLastLinePlaceholder | '' |
expand | true |
includeChangeCounts | false |
omitAnnotationLines | false |
patchColor | chalk.yellow |
关于这些选项的更多信息,见以下例子.
标签选项示例
如果应用程序是代码修改, 您可以替换标签 :
const options = {
aAnnotation: 'Original',
bAnnotation: 'Modified',
};
- Original
+ Modified
common
- changed from
+ changed to
这个 jest-diff 软件包不假定两个标签的长度相等.
已更改行的颜色选项示例
为了与大多数diff工具保持一致,您可以交换颜色:
import chalk from 'chalk';
const options = {
aColor: chalk.red,
bColor: chalk.green,
};
已更改子字符串的颜色选项示例
虽然对已更改的子字符串来说, 前景和背景颜色的默认反向很难击败 在行内,特别是因为它突出空格,如果您想要在黄色背景颜色上加粗体字体重:
import chalk from 'chalk';
const options = {
changeColor: chalk.bold.bgYellowBright,
};
格式化后缀空格的选项示例
因为 diff() 不在行内显示下行差异,格式化可以帮助您看到,当行因存在或缺少后行空格而出现差异时 /\s+$/ 正则表达式.
- 如果修改行有背景颜色,则可以看到后方的空格.
- 如果常见行带有默认暗色,则无法看到后方空格。 你可能希望黄色的背景颜色看到它们.
const options = {
aColor: chalk.rgb(128, 0, 128).bgRgb(255, 215, 255), // magenta
bColor: chalk.rgb(0, 95, 0).bgRgb(215, 255, 215), // green
commonLineTrailingSpaceColor: chalk.bgYellow,
};
色彩选项的值是一个函数,它给出了字符串,返回字符串.
如果您想要用中点字符替换后端空格 :
const replaceSpacesWithMiddleDot = string => '·'.repeat(string.length);
const options = {
changeLineTrailingSpaceColor: replaceSpacesWithMiddleDot,
commonLineTrailingSpaceColor: replaceSpacesWithMiddleDot,
};
如果您需要颜色选项的类型脚本 :
import {DiffOptionsColor} from 'jest-diff';
无颜色选项示例
要将差异存储在文件中, 不为颜色设置逃生代码, 提供身份功能 :
const noColor = string => string;
const options = {
aColor: noColor,
bColor: noColor,
changeColor: noColor,
commonColor: noColor,
patchColor: noColor,
};
指标备选方案实例
与《公约》保持一致 diff 命令,您可以替换指标 :
const options = {
aIndicator: '<',
bIndicator: '>',
};
这个 jest-diff 一揽子假设(但不执行)3个指标的长度相等.
限制常见行的选项示例
默认情况下,输出包括所有常见行.
为了强调这些变化,你可能会限制常见的“文字”行的数目:
const options = {
contextLines: 1,
expand: false,
};
类似补丁标记 @@ -12,7 +12,9 @@ 用于省略的普通行.
补丁标记颜色选项示例
如果您希望补丁标记的颜色与常见行相同:
import chalk from 'chalk';
const options = {
expand: false,
patchColor: chalk.dim,
};
包含更改计数的选项示例
在注释行右侧显示更改行数 :
const a = ['common', 'changed from'];
const b = ['common', 'changed to', 'insert'];
const options = {
includeChangeCounts: true,
};
const difference = diff(a, b, options);
- Expected - 1
+ Received + 2
Array [
"common",
- "changed from",
+ "changed to",
+ "insert",
]
删除注释行的选项示例
只显示比较线:
const a = 'common\nchanged from';
const b = 'common\nchanged to';
const options = {
omitAnnotationLines: true,
};
const difference = diffStringsUnified(a, b, options);
common
- changed from
+ changed to
空出第一行或最后一行的选项示例
如果 第一个 或者说 最后一个 比较线是 空,因为内容是空的,指示器是空的,所以你可能不会注意到它.
替换选项是默认值为 '' 空字符串.
因为Jest在匹配器失败时会剪切报告,所以删除了一行空的最后一行.
因此,杰斯特将下行箭头和左角作为占位符:
const options = {
emptyFirstOrLastLinePlaceholder: '↵', // U+21B5
};
如果一个内容行是空的,那么相应的比较行会自动被修剪去除默认指标的比值空间(下面作为中间点表示):
| 指标 | 未调整 | 修剪 |
|---|---|---|
aIndicator | '-·' | '-' |
bIndicator | '+·' | '+' |
commonIndicator | ' ·' | '' |
排序对象密钥的选项示例
当比较两个对象时,默认按字母顺序打印它们的密钥. 如果这不是密钥的原始顺序, diff 将更难被读取, 因为密钥不在其原始位置 .
使用 compareKeys 来传递一个在排序对象密钥时使用的函数.
const a = {c: 'c', b: 'b1', a: 'a'};
const b = {c: 'c', b: 'b2', a: 'a'};
const options = {
// The keys will be in their original order
compareKeys: () => 0,
};
const difference = diff(a, b, options);
- Expected
+ Received
Object {
"c": "c",
- "b": "b1",
+ "b": "b2",
"a": "a",
}
视实施情况而定 compareKeys 任意排序顺序都可以使用.
const a = {c: 'c', b: 'b1', a: 'a'};
const b = {c: 'c', b: 'b2', a: 'a'};
const options = {
// The keys will be in reverse order
compareKeys: (a, b) => (a > b ? -1 : 1),
};
const difference = diff(a, b, options);
- Expected
+ Received
Object {
"a": "a",
- "b": "b1",
+ "b": "b2",
"c": "c",
}