亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 Jest 中跟蹤失敗的異步測試?

如何在 Jest 中跟蹤失敗的異步測試?

qq_花開花謝_0 2023-05-11 16:12:48
問題已確定。在實際的代碼庫中,斷言被傳遞給一個導入的回調,一旦回調執行失敗的測試,它就會引發承諾拒絕。所以,這接近于測試的實際編寫方式:describe( "file system", () => {  it( "should check if the file exists", async () => {    call( async () => {      const received = await fileExists();      const expected = true;      expect( received ).toBe( expected );    });  });});并且復雜的回調以更簡單的方式呈現以產生相同的問題:export function call( callback) {  callback();}- 更新 -以下代碼有效。為了更好的可見性,我從大型代碼庫中選取了一小部分代碼。如果我只運行以下代碼,它會按預期工作。我認為實際代碼庫中存在問題。@Flask 關于集中處理未處理的承諾拒絕的建議為這個問題增加了很大的價值??紤]以下測試:import fileExists, { call } from "./exists";describe( "file system", () => {  it( "should check if the file exists", async () => {    const received = await fileExists();    const expected = true;    expect( received ).toBe( expected );  });});對于以下來源:import fs, { constants } from "fs";import { promisify } from "util";export default async function fileExists() {  const path    = ".nonexistent";  const access  = promisify( fs.access );  try {    await access( path, constants.F_OK );  } catch {    return false;  }  return true;}什么時候fileExists 拒絕退貨false,UnhandledPromiseRejectionWarning收到不出所料. 但這無助于追蹤失敗測試的根源。對于同步測試,Jest 會顯示測試路徑(即file system ? should check if the file exists),這有助于跟蹤失敗測試的來源。實現異步測試的最佳方法是什么?
查看完整描述

1 回答

?
茅侃侃

TA貢獻1842條經驗 獲得超21個贊

UnhandledPromiseRejectionWarning預計不會在這里。它不等同于失敗的測試,因為如果斷言通過,它不會阻止測試通過。這意味著代碼以錯誤的方式編寫并且包含不受限制的承諾。


await它只有在測試中被省略時才會發生:


fileExists(); // no await

或者fileExists函數包含松散的未處理的承諾:


fileExists() {

  whatever() // no return

  .then(() => {

    whatever() // no return

  })  // no catch to suppress errors

}

這是一個很好的做法setupFiles:


process.on('unhandledRejection', console.error);

它提供比UnhandledPromiseRejectionWarning錯誤堆棧更有用的輸出并允許調試問題。


查看完整回答
反對 回復 2023-05-11
  • 1 回答
  • 0 關注
  • 120 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號