tick()
ใน Cypress, cy.tick() ใช้สำหรับควบคุมเวลาในการทดสอบ. การใช้ cy.tick() จะเป็นประโยชน์ในการทดสอบที่มีตัวจับเวลา (timer) เช่น setTimeout หรือ setInterval และการทำงานที่เกี่ยวกับเวลาในแอปพลิเคชันของคุณ
ตัวอย่างการใช้ cy.tick():
// cypress/integration/tick_spec.js
describe('Testing timers with cy.tick()', () => {
it('should handle setTimeout', () => {
cy.visit('/your-page'); // Replace with the actual page you want to visit
cy.window().then((win) => {
// ใช้ฟังก์ชั่น setTimeout
win.setTimeout(() => {
console.log('setTimeout completed');
}, 1000);
// ใช้ cy.tick() เพื่อเลื่อนเวลาออกไป 1,000 มิลลิวินาที
cy.tick(1000);
// Assertions หลังจากมีการเรียกใช้ setTimeout
cy.get('.result').should('have.text', 'setTimeout completed');
});
});
it('should handle setInterval', () => {
cy.visit('/your-page'); // Replace with the actual page you want to visit
cy.window().then((win) => {
// ใช้ฟังก์ชั่น setInterval
const intervalId = win.setInterval(() => {
console.log('setInterval tick');
}, 500);
// ใช้ cy.tick() เพื่อเลื่อนเวลาออกไป 1,500 มิลลิวินาที
cy.tick(1500);
// Assertions หลังจากมีการเรียกใช้ setInterval
cy.get('.result').should('have.text', 'setInterval tick');
// Clear the setInterval
win.clearInterval(intervalId);
});
});
});
ในตัวอย่างนี้:
- ใน
should handle setTimeout, เราใช้cy.tick(1000)เพื่อข้ามเวลาไป 1000 มิลลิวินาที เพื่อทำให้setTimeoutเสร็จสิ้น - ใน
should handle setInterval, เราใช้cy.tick(1500)เพื่อข้ามเวลาไป 1500 มิลลิวินาที เพื่อทำให้setIntervalทำงานสามครั้ง
แม้ว่า cy.tick() จะทำงานได้ดีในการทดสอบ timers บางอย่าง แต่มีบางแง่ที่ควรพิจารณา ได้แก่:
- ไม่ได้ทำงานกับ requestAnimationFrame:
cy.tick()ไม่สามารถทำงานกับrequestAnimationFrameได้ แต่ Cypress มีคำสั่งอื่น ๆ เช่นcy.clock()ที่ช่วยในการทดสอบกับrequestAnimationFrameได้ดี - ต้องใช้กับคำสั่งที่ใช้เวลา:
cy.tick()มีประโยชน์มากที่สุดเมื่อใช้กับคำสั่งที่เกี่ยวข้องกับเวลา เช่นsetTimeoutหรือsetIntervalสำหรับการทดสอบการทำงานที่เกี่ยวข้องกับเวลาในแอปพลิเคชันของคุณ, ควรตรวจสอบว่ามีคำสั่งไหนที่เกี่ยวข้องกับเวลาบ้างและอาจจะต้องใช้cy.tick()ในการทดสอบ
wait()
ใน Cypress ใช้สำหรับรอให้เหตุการณ์หรือเงื่อนไขบางอย่างเป็นจริงก่อนที่จะดำเนินการต่อ ฟังก์ชันนี้มีหลายวิธีในการใช้ และมักถูกใช้เพื่อรอคอยการทำงานที่เกี่ยวข้องกับการโต้ตอบกับ server, การทำงานที่เกี่ยวข้องกับ DOM elements ที่มีการ render หรือ update, หรือเหตุการณ์อื่น ๆ ที่ต้องการรอ
นี้คือหลายๆ รูปแบบที่ cy.wait() สามารถใช้ได้:
cy.get('#your-element').click();
cy.wait(1000); // รอ 1 วินาที
cy.get('.result').should('have.text', 'Expected Result');
รอให้ request จาก server ที่ถูกเรียกใช้ได้ (แบบไม่ใช้ wait())
cy.intercept('GET', '/api/data').as('getData');
cy.get('#fetch-data-button').click();
cy.wait('@getData').then((xhr) => {
// ทำงานต่อหลังจากรอให้ request ทำงานเสร็จสมบูรณ์
cy.get('.result').should('have.text', 'Data fetched successfully');
});
รอให้เหตุการณ์ใน DOM เปลี่ยนแปลง
cy.get('#your-element').click();
cy.wait(() => {
// รอให้เงื่อนไขในฟังก์ชันเป็นจริง
return Cypress.$('.result').text() === 'Expected Result';
});
cy.wait() มีหลายวิธีที่สามารถใช้กับเหตุการณ์หรือเงื่อนไขที่คุณต้องการรอคอย การใช้คำสั่งนี้ ขึ้นอยู่กับการออกแบบทดสอบว่าต้องการทดสอบอะไรบ้างในเว็บไซต์ของคุณ
ความแตกต่างระหว่าง tick() กับ wait()
เราพอจะสรุปความแตกต่างของฟังก์ชัน cy.tick() และ cy.wait() ใน Cypress ได้แล้ว เพราะมันมีวิธีการใช้งานที่แตกต่างกันอย่างชัดเจน:
cy.tick():
- ใช้สำหรับควบคุมเวลาในการทดสอบ (time manipulation)
- ทำให้เวลาข้ามไปข้ามมิลลิวินาทีตามที่ระบุ
- มักถูกใช้ในการทดสอบ timers เช่น
setTimeout,setInterval, หรือrequestAnimationFrame
cy.wait():
- ใช้สำหรับรอให้เหตุการณ์หรือเงื่อนไขบางอย่างเป็นจริงก่อนที่จะดำเนินการต่อ
- ไม่ได้ทำควบคุมเวลา แต่เป็นการรอ
- มักถูกใช้ในการรอ response จาก server, การทำงานที่เกี่ยวข้องกับ DOM elements ที่มีการ render หรือ update, หรือเหตุการณ์อื่น ๆ ที่ต้องการรอ
ทั้งนี้สามารถเข้าไปดูวิธีการใช้งานเพิ่มเติมใน Documents ของ Cypress ต่อ ได้เลย