【问题标题】:How to test if two files are identical via mocha如何通过 mocha 测试两个文件是否相同
【发布时间】:2015-02-26 02:15:02
【问题描述】:

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

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

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

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

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

我应该注意,我并不是要重新发明轮子。我已经尝试过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 测试两个文件差异的正确方法是什么?

【问题讨论】:

    标签: node.js file diff mocha.js


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 感谢 diff 库的建议。但是我正在寻找如何测试mocha 中的差异。
      • 我不明白其中的区别?你只需要在你的 mocha 测试中使用这个库并断言输出?
      • 在我的问题中,我表明我正在这样做,断言来自 prettydiff 的结果,这是一个在两个文件之间进行差异的 node.js 库。但是,当我这样做时,我收到错误Uncaught TypeError: object is not a function。我做错了什么,只是不确定是什么。我认为我的问题很清楚,也许我需要创建一个示例存根并发布完整的代码。
      • 我的猜测是你的模块中不需要 prettyDiff 或者你没有正确使用他们的 api
      • 现在只是创建一个测试用例,看起来你的第二个猜测是正确的。
      【解决方案3】:

      您是否尝试过使用 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

      【讨论】:

        猜你喜欢
        • 2016-02-26
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-05-21
        • 2014-06-11
        • 1970-01-01
        相关资源
        最近更新 更多