javascript - Bagaimana cara menguji error untuk stream di nodejs?
Saya memiliki sebuah fungsi yang membuat md5 dan saya telah membuat tes yang memeriksa perilakunya, skripnya bekerja. Sekarang saya perlu membuat tes yang memeriksa janji ditolak ketika createHash() atau createReadStream() gagal. Bagaimana cara menguji skenario ini, ada praktik terbaik? Saya akan menghargai jika Anda bisa memposting contoh, terima kasih!
export const md5 = (path: string) =>
new Promise<string>((resolve, reject) => {
const hash = createHash("md5");
const rs = createReadStream(path);
rs.on("error", reject);
rs.on("data", chunk => hash.update(chunk));
rs.on("end", () => resolve(hash.digest("hex")));
});
describe("md5", () => {
const fileName = `${TEST_DIR}/file1.txt`;
beforeAll(() => createFile(fileName));
afterAll(() => removeFile(TEST_DIR));
it("should hash md5 a file", () => {
md5(fileName).then((hash: string) => {
assert.strictEqual(hash, "4738e449ab0ae7c25505aab6e88750da");
});
});
});
Jawaban #1
Saya perlu membuat tes yang memeriksa apakah janji ditolak
Cobalah kode di bawah ini: parameter kedua dari blok Jasmine it adalah sebuah fungsi yang memiliki parameter done yang diberikan kepadanya. done adalah sebuah fungsi yang dapat dipanggil pengguna untuk membuat pengujian berhasil. Jika done tidak dipanggil dalam jendela waktu, Jasmine menganggap pengujian sebagai gagal.
stream-reader.js
const fs = require('fs')
const createReader = inputFile => {
const reader = fs.createReadStream(inputFile, {encoding: 'utf8'})
const result = new Promise((resolve, reject) => {
reader.on('error', e => reject(e))
})
// return 2 things...
return {
reader, // ...a stream that broadcasts chunks over time
result, // ...a Promise to be resolved on reading is done or error encountered
}
}
module.exports = createReader
spec.js
const streamReader = require('../stream-reader')
const INPUT_FILE = './input1.txt'
describe('streamReader', () => {
it(`should pass a chunk of the file on 'data' event`, (done) => {
const api = streamReader(INPUT_FILE)
api.reader.on('data', (chunk) => {
console.log('[JASMINE TEST 1] received', chunk)
done()
})
})
/* test Promise.reject on stream error */
it(`should reject on case of reading errors`, (done) => {
const api = streamReader('./non/existent/file')
api.result.catch(e => {
console.log('[JASMINE TEST 2] correctly rejected')
done()
})
})
})
keluaran
npm test
> [email test C:\Users\jonathanlopez\nodejs\so-stream-reject
> jasmine
Randomized with seed 22758
Started
[JASMINE TEST 1] received the quick brown fox
.[JASMINE TEST 2] correctly rejected
.
2 specs, 0 failures
Finished in 0.026 seconds
Randomized with seed 22758 (jasmine --random=true --seed=22758)
Semoga ini membantu. Salam.
Jawaban #2
Anda bisa menggunakan fungsi md5 Anda untuk kesalahan dengan cara ini
md5('bad_path').catch((error: Error) => {
assert.strictEqual(error.message.length > 0, true);
});
