我编写了一个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测试两个文件差异的正确方法是什么?
答案 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