私は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();
});
});
驚いたことに、誰も提案していません Buffer.equals 。これは最も速くて簡単なアプローチのようで、v0.11から存在しています。
したがって、コードはtmpBuf.equals(testBuf)
になります
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>
...
>
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)メソッドなどのサードパーティモジュールを使用します。
file-compare
とnode-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);
});
大きなファイルを比較するため。ファイルアップロードをアサートするときの画像は、バッファまたは文字列と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をアサーションモジュールとして使用する代わりに、別のツールを使用できます
少なくとも他の操作をブロックしないようにするために、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')
}
});
});
小さくて単一のスクリプトの場合でも、結果はほぼ同じになります