我有這段 Jest 測驗庫代碼:
describe('Component', () => {
const { container } = renderComponent(); // defined outside of describe block
test('Renders test1', () => {
expect(container.getElementsByClassName('test1').length).toBe(1);
});
test('Renders test2', () => {
expect(container.getElementsByClassName('test2').length).toBe(1);
});
});
這兩項測驗都應該通過,但只有一項可以通過。另一個總是失敗。
如果我一次只運行一個測驗.only,它總是通過。
官方 Jest 檔案說:
如果您有一個測驗在作為更大套件的一部分運行時經常失敗,但在單獨運行時卻沒有失敗,那么很可能來自不同測驗的某些東西會干擾這個測驗。您通常可以通過使用 beforeEach 清除一些共享狀態來解決此問題。
但我不確定到底是什么干擾了這里?并行呼叫getElementsByClassName會導致這個問題嗎?
uj5u.com熱心網友回復:
不,getElementsByClassName是非侵入性的。如,呼叫它不應該對正在查詢的 DOM 進行任何更改。1
你沒有展示什么renderComponent(),它可能是相關的。但是,根據您的描述,每個測驗呼叫一次而不是每個測驗套件呼叫一次應該可以解決問題。2
這應該有效:
let container;
describe('Component', () => {
beforeEach(() => {
container = renderComponent().container;
})
it('Renders test1', () => {
expect(container.getElementsByClassName('test1').length).toBe(1);
});
it('Renders test2', () => {
expect(container.getElementsByClassName('test2').length).toBe(1);
});
});
1 JavaScript 流暢而強大。例如,可以撰寫一個改變目標的 getter,而不僅僅是讀取它。但是在測驗庫提供的工具中使用這種反模式的機會很低。
2 這不應被視為“讓測驗通過的駭人聽聞的方式”。這是正確的測驗方法。您的測驗不應重復使用相同的 DOM,因為您不希望對該 DOM 的任何更改在多個測驗中傳播。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/418262.html
標籤:
下一篇:承諾不按預期作業的誤解?
