我有一些非同步(I/O綁定)任務要做,然後我想用Chai
來assert
傳回的值。而不是寫出像這樣的一段程式碼:
expect(await taskA.someAsync()).to.be.eq(something); expect(await taskB.someAsync()).to.be.eq(something);
我想要等待所有任務完成,使用await Promise.all([taskA.someAsync(), taskB.someAsync()])
,然後逐一expect
或assert
結果。
我創建了這個函數(偽代碼)來使事情更通用:
type TransactionInfo = { txn: Promise<any>; // 要等待的异步任务 assertion: Chai.Assertion // 要在txn结果上运行的断言 } const assertAll = async function(...txns: TransactionInfo[]) { let values = await Promise.all(allTxns); for (let txnInfo of txns) { evaluate(txnInfo.assertion) } }
這個函數的作用是await
所有的txns
,然後對每個txn執行每個assertion
來驗證傳回的值。
首先,我不確定Chai.Assertion
類型對於assertion
是否正確。其次,我不知道如何實例化一個包含不同類型斷言(如eq
或have.lengthOf
)的TransactionInfo
數組。最後,我不知道如何在以後評估assertion
物件。
P.S. 我不是一個專業的JavaScript開發者。請友善點:)
P粉6620895212023-09-17 14:13:13
import { expect } from 'chai'; type TransactionInfo = { txn: Promise<any>; // 要等待的异步任务 assertion: () => void; // 表示要在txn结果上运行的断言函数 }; const assertAll = async function (...txns: TransactionInfo[]) { let values = await Promise.all(txns.map((txnInfo) => txnInfo.txn)); txns.forEach((txnInfo, index) => { txnInfo.assertion(values[index]); }); };
使用這段程式碼,現在可以建立一個TransactionInfo物件的數組,每個物件都有自己的自訂斷言函數:
// 示例用法: const txn1: TransactionInfo = { txn: someAsyncTaskA(), assertion: (result) => { expect(result).to.be.eq(something); }, }; const txn2: TransactionInfo = { txn: someAsyncTaskB(), assertion: (result) => { expect(result).to.have.lengthOf(3); }, }; // 使用TransactionInfo对象数组调用assertAll函数 await assertAll(txn1, txn2);