Я написал сценарий 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
.
Как правильно проверить разницу двух файлов с помощью мокко?
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.
Второй полезен, если вы хотите обработать результаты программно, и это единственный простой способ определить, идентичны ли файлы.
Вы пробовали запустить 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
Может этот модуль? Или что-то вроде этого?
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);
Похожие вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.