web-dev-qa-db-ja.com

2つのファイルの内容が同じかどうかを確認するにはどうすればよいですか?

私はmocha/supertest /should.jsを使用してRESTサービスをテストしています

GET /files/<hash>はファイルをストリームとして返します。

should.jsでファイルの内容が同じであることをどのように主張できますか?

it('should return file as stream', function (done) {
    var writeStream = fs.createWriteStream('test/fixtures/tmp.json');

    var req = api.get('/files/676dfg1430af3595');
    req.on('end', function(){
       var tmpBuf = fs.readFileSync('test/fixtures/tmp.json');
       var testBuf = fs.readFileSync('test/fixtures/test.json');

       // How to assert with should.js file contents are the same (tmpBuf == testBuf )
       // ...

       done();
    });
});
14
hellboy

驚いたことに、誰も提案していません Buffer.equals 。これは最も速くて簡単なアプローチのようで、v0.11から存在しています。

したがって、コードはtmpBuf.equals(testBuf)になります

17
Max

should.jsでは、.eqlを使用してBufferのインスタンスを比較できます。

> var buf1 = new Buffer('abc');
undefined
> var buf2 = new Buffer('abc');
undefined
> var buf3 = new Buffer('dsfg');
undefined
> buf1.should.be.eql(buf1)
...
> buf1.should.be.eql(buf2)
...
> buf1.should.be.eql(buf3)
AssertionError: expected <Buffer 61 62 63> to equal <Buffer 64 73 66 67>
    ...
> 
4
den bardadym

3つの解決策があります。

最初

結果の文字列を比較する

tmpBuf.toString() === testBuf.toString();

ループを使用してバッファをバイトごとに読み取る

var index = 0,
    length = tmpBuf.length,
    match = true;

while (index < length) {
    if (tmpBuf[index] === testBuf[index]) {
        index++;
    } else {
        match = false;
        break;
    }
}

match; // true -> contents are the same, false -> otherwise

3番目

buffertools やbuffertools.compare(buffer、buffer | string)メソッドなどのサードパーティモジュールを使用します。

4
micnic

file-comparenode-tempを使用した解決策:

it('should return test2.json as a stream', function (done) {
    var writeStream = temp.createWriteStream();
    temp.track();

    var req = api.get('/files/7386afde8992');

    req.on('end', function() {
        comparator.compare(writeStream.path, TEST2_JSON_FILE, function(result, err) {
            if (err) {
                return done(err);
            }

            result.should.true;
            done();
        });
    });

    req.pipe(writeStream);
});
3
hellboy

大きなファイルを比較するため。ファイルアップロードをアサートするときの画像は、バッファまたは文字列とshould.eqlの比較に時間がかかります。 cryptoモジュールでバッファハッシュをアサートすることをお勧めします:

const buf1Hash = crypto.createHash('sha256').update(buf1).digest();
const buf2Hash = crypto.createHash('sha256').update(buf2).digest();
buf1Hash.should.eql(buf2Hash);

より簡単なアプローチは、次のようにバッファ長をアサートすることです。

buf1.length.should.eql(buf2.length)

shouldjsをアサーションモジュールとして使用する代わりに、別のツールを使用できます

1
smoebody

少なくとも他の操作をブロックしないようにするために、JavaScriptで 非ブロック呼び出し を使用してパフォーマンスを向上させる必要があると思います。

ブロッキングとは、Node.jsプロセスでの追加のJavaScriptの実行が、JavaScript以外の操作が完了するまで待機する必要がある場合です。これは、ブロック操作が発生している間、イベントループがJavaScriptの実行を継続できないために発生します。

Node.jsでは、I/OなどのJavaScript以外の操作を待機するのではなく、CPUを集中的に使用するためにパフォーマンスが低下するJavaScriptは、通常、ブロッキングとは呼ばれません。 libuvを使用するNode.js標準ライブラリの同期メソッドは、最も一般的に使用されるブロッキング操作です。ネイティブモジュールにもブロッキングメソッドがある場合があります。

したがって、Sync呼び出しを次のコードのようなものに変更します。また、equalsが提案するメソッドMaxを使用して、両方のファイルを比較します。

const fs = require('fs')

fs.readFile('file1', (err, data1) => {
    if (err) throw err;
    fs.readFile('file2', (err, data2) => {
        if (err) throw err;
        if (data1.equals(data2)) {
            console.log('EQUAL')
        } else {
            console.log('NON EQUAL')
        }

    });
});

小さくて単一のスクリプトの場合でも、結果はほぼ同じになります

0
ChesuCR