如何通过mocha测试两个文件是否相同

How to test if two files are identical via mocha

我写了一个 node.js 脚本,它扫描一个非常大的遗留代码库并应用一组更改。

更改可能会非常复杂,因为这会影响某些存储机制和关联的大小定义。

我已经使用 mocha、chai 和 sinon 编写了所有计算和报告都是正确的测试。 '

现在我正在尝试编写一个测试,将更改应用到旧源的 20 个样本。我可以创建具有正确更改的 20 个样本的版本,我只想让我的测试将应用的更改与预测的更改进行比较。

所以本质上,测试是文件 A 和文件 B 之间的差异,结果应该是文件相同。 Google 显示了很多关于数组、字符串和对象差异的结果。有没有人知道如何为文件执行此操作的解决方案?

我应该指出,我并不是要重新发明轮子。我已经用 prettydiff 进行了实验,其中的内容类似于:

prettydiff({source: processedFile, diff: expectedFile, lang: 'text'}).should.equal("Number of differences: 0 differences from 0 lines of text.");

我也试过:

expect(prettydiff({source: processedFile, diff: expectedFile, lang: 'text'})).to.equal("Number of differences: 0 differences from 0 lines of text.");

然而,我在这两种情况下得到的都是一个错误,指出 Uncaught TypeError: object is not a function

使用 mocha 测试两个文件差异的正确方法是什么?

也许是这个模块?或者类似的东西?

https://www.npmjs.com/package/diff

来自他们的 api 文档: https://www.npmjs.com/package/prettydiff

var prettydiff = require("prettydiff"),
    args       = {
        source: "asdf",
        diff  : "asdd",
        lang  : "text"
    },
    output     = prettydiff.api(args);

事实证明这比我预期的要复杂一点。

在 sctskw 的帮助下,我们确定第一个问题是 prettydiff api 的使用不正确。不幸的是,它没有解决如何在 node.js 内区分两个文件的问题。

我找到的库只接受字符串来执行差异。

prettydiff 向结果中添加了大量 html 内容,这样您就不得不将输出重定向到一个文件并在浏览器中查看结果。如果您希望以编程方式分析结果,则不太适合。

jsdiff 报告每一行,每行有几个变量以确定它是新行还是已删除的行。

在这两种情况下,都必须先读取文件。所以这两种方法的通用代码如下:

var fs = require ('fs');

var source = "";
var target = "";

try {
  source = fs.readFileSync('a.txt', 'utf8');
} catch(e) {
  console.error("error reading a.txt: " + e.message);
  return;
}

try {
  target = fs.readFileSync('b.txt', 'utf8');
} catch(e) {
  console.error("error reading a.txt: " + e.message);
  return;
}

要测试 prettydiff 中的文件,请执行以下操作:

var prettydiff = require('prettydiff');

output = prettydiff.api({
  source: source, 
  mode: 'diff',
  diff: target, 
  lang: 'text',
});

console.log(output[0]);

只需确保在 运行 输出时将输出重定向到文件,然后在您选择的浏览器中查看结果。

要测试 jsdff 中的文件,请执行以下操作:

var diff = require('diff');
var results = diff.diffLines(source, target);
var identical = true;

results.forEach(function(part) {
  if(part.added) {
    console.log("added:   " + part.value);
    identical = false;
  }
  if(part.removed) {
    console.log("removed: " + part.value);
    identical = false;
  }
});

console.log("Identical? " + identical);

显然代码不是最有效的,现在可以采用更智能的方法来处理文件而不是使用同步,但是示例清楚地演示了如何在 node.js 中区分文件。

如果您希望以编程方式处理结果,则第二个很有用,并且是确定文件是否相同的唯一简单方法。

您是否尝试过使用 diffcli 选项从命令行 运行ning Pretty Diff

当我运行:

node api/node-local.js source:"prettydiff.js" diff:"prettydiff.js" mode:"diff" diffcli:"true"

命令行报告:

Pretty Diff found 0 differences in 1 files out of 1 file. Executed in 0.058 seconds.

有一些关于此的文档: http://prettydiff.com/guide/diffcli.xhtml