โดยปกติแล้วเวลาที่เราใช้งาน React หรือ NextJS เลี่ยงไม่ได้ที่จะต้องใช้ Library ต่างๆ และอาจจะมี Library บางตัวที่ต้องกำหนดค่าบางอย่างไว้ตรง root เช่น Provider ของ Redux
หากใครต้องการเอา Cypress มาใช้ในการทดสอบ Component Testing จะพบว่า หาก Component นั้นเป็นแบบ Stateless หรือไม่ได้เรียกใช้งาน Redux (ไม่มี Dependency) เราสามารถใช้ cy.mount(<Component />) ที่เป็นตัว Default ได้เลย
แต่ถ้าหากใน Components นั้น มีการใช้งาน Redux แล้ว มันจะใช้ cy.mount ตรงๆ เลยไม่ได้ เราต้องมากำหนด การตั้งค่า Redux ในส่วนนี้ด้วย โดยการสร้าง mount ตัวใหม่ขึ้นมาใช้งา ซึ่ง Cypress ก็จะเปิดโอกาศในเราสามารถ Custom Mount Commands เพื่อกำหนดการเรียกใช้งานของ Redux ได้เลย
วิธีการกำหนดนี้เป็นของ cypress version 13.5.1
Redux
สมมติว่า เรามีการกำหนด Redux ไว้ดังนี้
Initial Store
การกำหนดค่า createStore และ การกำหนด ReturnType โดยใช้คำสั่ง
วิธีการตั้งค่า Redux ใน Cypress
- เข้าไปที่ cypress/support
- เข้าไปที่ไฟล์ commands.tsx
ในไฟล์นี้จะเป็นการกำหนด 2 ส่วน คือ การกำหนด interface ของ function mount ตัวใหม่ของเรา และการกำหนด Command.add ที่เป็นตัว wrap Provider ของ Redux ไว้
- วิธีการใช้งาน
ถ้าหาก Component ไหนมีการใช้การ Redux ภายใน Component ให้เราเปลี่ยนจาก cy.mount เป็น cy.mountWithRedux (ชื่อที่ได้ตั้งไว้)
วิธีการใช้งาน store เราสามารถ import store จากไฟล์ store/index.ts และใช้คำสั่ง dispatch ในการกำหนดค่าลง redux ได้เลย
store.dispatch({
type: 'SET_ALERT',
payload: {
open: true,
type: 'warning',
title: 'Error',
subtitle: 'Message Error',
},
});
และส่งค่าของ store ไปยัง mountWithRedux ได้เลย
cy.mountWithRedux(<LoadingPopup />, { reduxStore: store });
จะสังเกตุว่า ในส่วนของ wrapped ตรงคำสั่ง Cypress.Commands.add เราสามารถเพิ่มการใช้งานต่างๆ ลงไปได้อีก และเราสามารถสร้าง Commands ใหม่ๆ ได้อีก เพื่อรองรับความหลากหลายในการทดสอบ
การ Import CSS
ปกติแล้วหากเรามีการ Import CSS เข้ามาใช้งานใน root ไฟล์ เมื่อเรา cy.mount แล้ว CSS จะไม่ทำงาน เราสามารถแก้ไข้เพิ่มได้โดยการ Import ไฟล์ CSS เข้ามาในการ mount ได้เหมือนกัน
วิธีการ Import CSS เข้ามาใช้งานใน mount ของ Cypress
- ไปที่ cypress/support/components.ts
- จากนั้นก็ Import ไฟล์ CSS เข้ามาใช้งานได้เลย ซึ่งการ Import ไว้ในไฟล์ Components.ts นี้ เราจะสามารถใช้งานได้ในทุกๆ commands (Custom mount Command)
Ref: https://docs.cypress.io/guides/component-testing/react/examples#Redux