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

时间:2015-02-26 02:15:03

标签: node.js file diff 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测试两个文件差异的正确方法是什么?

3 个答案:

答案 0 :(得分:2)

这比我想象的要复杂得多。

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

我发现的lib只接受字符串来执行diff。

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中区分文件。

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

答案 1 :(得分:1)

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

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);

答案 2 :(得分:-1)

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

当我跑步时:

  

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

命令行报告:

  

Pretty Diff在1个文件中找到0个差异。执行时间为0.058秒。

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