[英]Jasmine Async test generation
假設我們有一個 promise 執行大量操作並返回輔助函數。 一個平庸的例子:
const testPromise = testFn => () => {
const helper = Promise.resolve({testHelper: () => 'an helper function'}) // I/O Promise that returns an helper for testing
return helper.then(testFn).finally(() => console.log('tear down'));
}
// This describe would work as expected
describe('Async test approach', () => {
it('A test', testPromise(async ({testHelper}) => {
expect(testHelper()).toBe('an helper function')
}))
})
// This part doesn't work
describe('Async describe approach', testPromise(async ({testHelper}) => {
it('Test 1', () => {
expect(testHelper()).toBe('an helper function')
})
it('Test 2', () => {
expect(testHelper()).not.toBe('A chair')
})
}))
}
我想要實現的是類似於第二個示例,我可以在 describe 中使用異步代碼而無需重新評估testPromise
。
describe
不處理異步,所以我什至無法正確循環和創建動態測試。
我確實閱讀了很多評論,說describe
應該只是對測試進行分組的一種簡單方法,但是......然后......有人如何根據 I/O 結果進行異步生成的測試?
謝謝
= 額外考慮 =
關於你們好心添加的所有評論,我應該添加一些額外的細節......
我很清楚必須同步定義測試:),這正是問題開始的地方。 我完全不同意這一點,我試圖找到一個替代方案,避免之前/之后並在不指定外部變量的情況下執行它。 在 Jest 問題中,有一個開放的問題可以解決這個問題,似乎他們確實同意使 describe async 但他們不會這樣做。 原因是...... Jest 正在使用描述的 Jasmine 實現,這個“修復”應該在那里完成。
我想盡可能避免beforeAll
和afterAll
。 我的目的是創建一種簡單(且簡潔)的方式來定義根據我的需求量身定制的集成測試,而無需讓用戶擔心初始化和拆除周圍的東西。 我將繼續使用上述示例 1 的風格,這對我來說似乎是最好的解決方案,即使這顯然是一個更長的過程。
看看定義測試。 醫生說:
為了讓 Jest 能夠收集您的測試,必須同步定義測試。
這是定義測試用例的原則。 這意味着應該同步定義it
function 。 這就是為什么您的第二個示例不起作用的原因。
一些 I/O 操作應該在beforeAll
、 afterAll
、 beforeEach
、 afterEach
方法中完成,以准備您的測試替身和夾具。 測試應盡可能與外部環境隔離。
如果一定要這么做,或許可以將動態獲取的testHelper
function寫入一個static js文件,然后同步測試
如前所述, describe
用於對測試進行分組。
這可以通過beforeAll
來實現。 由於beforeAll
應該以任何方式調用,因此可以將其移至testPromise
:
const prepareHelpers = (testFn) => {
beforeAll(() => {
...
return helper.then(testFn);
})
}
describe('Async describe approach', () => {
let testHelper;
prepareHelpers(helpers => { testHelper = helpers.testHelper });
...
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.