簡體   English   中英

如何在Node.js中測試流的錯誤?

[英]How to test error for a stream in nodejs?

我有一個創建md5的函數,並且創建了一個檢查其行為的測試,該腳本有效。 現在,我需要創建一個測試,以檢查在createHash()createReadStream()失敗時是否拒絕了createHash() 如何測試這種情況下的最佳實踐? 如果您可以發布示例,我們將不勝感激,謝謝!

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");
    });
  });
});

我需要創建一個測試來檢查諾言是否被拒絕

試試下面的代碼:茉莉花的第二個參數it塊是有參數的函數done傳遞給它。 done的是,用戶可以調用,以使測試通過的功能。 如果未在超時窗口內調用done ,則Jasmine認為測試失敗

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()
        })
    })
})

輸出

$ npm test

> so-jasmine-test@1.0.0 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)

希望這可以幫助。 干杯。

您可以通過這種方式使md5函數出錯

md5('bad_path').catch((error: Error) => {
  assert.strictEqual(error.message.length > 0, true);
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM