Cypress testing libray를 설치 후 Form 가져오기
describe("로그인", () => {
it("홈페이지로 이동해야 합니다.", () => {
cy.visit("/").title().should("eq", "로그인 | Nuber Eats");
});
it("Form에 내용을 입력해야 합니다.", () => {
cy.visit("/")
.findByPlaceholderText("이메일")
.type("test@mail.com")
.findByPlaceholderText("비밀번호")
.type("123123")
.findByRole("button")
.should("not.have.class", "pointer-events-none");
});
});
Cypress 실행하여 테스트
npx cypress open
테스트 결과 : 에러 - 체인으로 연결되지 않았음
- react tesing library - 계속 연결하는 걸 허용하지 않음 - 분리가 필요
- findBy로 시작하는 커스텀 쿼리 함수는 체인 방식으로 작동하지 않음
- findByPlaceholderText와 같은 findBy 메서드는 React Testing Library에서 제공하는 비동기 쿼리 메서드이다.
- 이유는 Cypress의 findBy 메서드가 기본적으로 Promise 객체를 반환한다.
- Cypress는 비동기 방식으로 DOM을 조회하고 상태를 확인하는 특성을 가지고 있기 때문이다.
- findByPlaceholderText를 사용할 때, 또 다른 cy로 분리해야 한다.
에러 해결 방법 01 : cy 분리하여 작성
describe("로그인", () => {
it("홈페이지로 이동해야 합니다.", () => {
cy.visit("/").title().should("eq", "로그인 | Nuber Eats");
});
it("Form에 내용을 입력해야 합니다.", () => {
cy.visit("/");
cy.findByPlaceholderText("이메일").type("test@mail.com");
cy.findByPlaceholderText("비밀번호").type("123123");
cy.findByRole("button").should("not.have.class", "pointer-events-none");
});
it("이메일, 비밀번호 검증의 오류를 표시해야 합니다.", () => {
cy.visit("/");
cy.findByPlaceholderText("이메일").type("bad@email");
cy.findByRole("alert").should("have.text", "잘못된 이메일 형식입니다.");
});
});
- .type은 체인 가능
cy를 변수명으로 교체
describe("로그인", () => {
const user = cy;
it("홈페이지로 이동해야 합니다.", () => {
user.visit("/").title().should("eq", "로그인 | Nuber Eats");
});
it("Form에 내용을 입력해야 합니다.", () => {
user.visit("/");
user.findByPlaceholderText("이메일").type("test@mail.com");
user.findByPlaceholderText("비밀번호").type("123123");
user.findByRole("button").should("not.have.class", "pointer-events-none");
});
it("이메일, 비밀번호 검증의 오류를 표시해야 합니다.", () => {
user.visit("/");
user.findByPlaceholderText("이메일").type("bad@email");
user.findByRole("alert").should("have.text", "잘못된 이메일 형식입니다.");
});
});
보기 좋게 하려는 의도
해결방법 02 : 체인으로 사용하고 싶다면 findBy를 쓰는 대신 get 사용
describe("로그인", () => {
const user = cy;
it("홈페이지로 이동해야 합니다.", () => {
user.visit("/").title().should("eq", "로그인 | Nuber Eats");
});
it("Form에 내용을 입력해야 합니다.", () => {
user
.visit("/")
.get("input[placeholder='이메일']")
.type("test@mail.com")
.get("input[placeholder='비밀번호']")
.type("123123")
.get("button")
.should("not.have.class", "pointer-events-none");
});
it("이메일, 비밀번호 검증의 오류를 표시해야 합니다.", () => {
user
.visit("/")
.get("input[placeholder='이메일']")
.type("bad@email")
.get('[role="alert"]')
.should("have.text", "잘못된 이메일 형식입니다.");
});
});
- Cypress 기본 메서드 cy.get()을사용하는 것이 좋다.
- 비동기적인 메서드들에 대해 .then() 을 사용하여 후속 작업을 수행할 수 있다.
- Cypress 기본 메서드 cy.get()은 DOM을 찾아 해당 요소에 대한 명령어를 체인 방식으로 사용할 수 있게 해 준다.
- 이 경우, CSS 선택자나 텍스트를 기반으로 요소를 찾는다.
'Frontend > Cypress' 카테고리의 다른 글
Custom Commands (0) | 2024.12.02 |
---|---|
Intercept() : cypress를 이용해 request를 가로채는 법 (0) | 2024.11.29 |
Cypress, 브라우저의 localStorage에 저장된 값을 검증하는 코드 테스트 (0) | 2024.11.25 |
Cypress testing libray 설치 (0) | 2024.11.14 |
Cypress, 실제 사용 환경에 가까운 테스트 (0) | 2024.11.14 |