Я написал сценарий node.js, который сканирует очень большую базу устаревшего кода и применяет набор изменений.

Изменения могут быть довольно сложными, поскольку они затрагивают определенные механизмы хранения и связанные определения размеров.

Я написал тесты, подтверждающие правильность всех расчетов и отчетов при использовании мокко, чая и синона. '

Теперь я пытаюсь написать тест, который применяет изменения к 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.

Как правильно проверить разницу двух файлов с помощью мокко?

2
Metalskin 26 Фев 2015 в 05:15

3 ответа

Лучший ответ

Это оказалось немного сложнее, чем я ожидал.

С помощью sctskw мы определили, что первая проблема заключалась в неправильном использовании API prettydiff. К сожалению, он не решил, как различать два файла в 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
Metalskin 26 Фев 2015 в 05:03

Вы пробовали запустить Pretty Diff из командной строки с параметром diffcli ?

Когда я бегу:

узел api / node-local.js источник: «prettydiff.js» diff: «prettydiff.js» режим: «diff» diffcli: «true»

Командная строка сообщает:

Pretty Diff обнаружил 0 отличий в 1 файле из 1. Выполнено за 0,058 секунды.

Об этом есть некоторая документация: http://prettydiff.com/guide/diffcli.xhtml

-1
Austin Cheney 4 Мар 2015 в 16:21

Может этот модуль? Или что-то вроде этого?

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);
1
sctskw 26 Фев 2015 в 03:44