CYBERSOFT
Đăng nhập

cy.intercept & điều khiển network: stub, spy, fixtures và trạng thái

Chuyên công nghệCypressMockingThực tế
🗓 1 tháng trước19 phút đọc·👁 831 lượt xem👤 93 người đọc

Làm chủ cy.intercept để test SPA xác định: stub response, spy request, dùng fixtures, alias + cy.wait, và phủ đủ trạng thái loading/empty/error/success cho dashboard SaaS.

1. Vì sao phải điều khiển network khi test

Ứng dụng SaaS hiện đại phụ thuộc nặng vào API: dashboard tải danh sách dự án, biểu đồ gọi endpoint thống kê, thông báo đến qua polling. Nếu test E2E luôn đập vào backend thật, bạn phải phụ thuộc dữ liệu server, khó tái tạo trạng thái lỗi, và test chậm và giòn. Đó là lúc cy.intercept vào cuộc: nó chặn tầng network của app ngay trong trình duyệt, cho bạn quyền quyết định request nào được stub (trả dữ liệu giả) và request nào chỉ spy (theo dõi mà vẫn cho đi thật). Nhờ đó bạn dựng được mọi trạng thái: danh sách rỗng, lỗi 500, tải chậm, phân trang — tất cả một cách xác định.

cy.intercept — chặn & điều khiển tầng network của app App gọi GET /api/products cy.intercept() match route → stub/spy gắn alias '@list' fixtures/list.json forceNetworkError / 500 cy.wait('@list') → chặn tới khi request xảy ra, trả về đối tượng interception (req/res) Test được: loading · empty · error · phân trang — không cần backend thật
cy.intercept chặn route, gắn alias, stub hoặc spy.
  • Stub: trả response giả để dựng trạng thái xác định.
  • Spy: cho request đi thật nhưng theo dõi để assert.
  • Alias + cy.wait('@x'): đồng bộ test với thời điểm request.
  • Fixtures: lưu dữ liệu mẫu trong file JSON để tái dùng.

2. Cơ chế: cy.intercept khớp route thế nào

cy.intercept nhận một mẫu route (method + URL, có thể dùng glob hoặc regex) và một handler quyết định làm gì. Khi app phát ra request khớp, Cypress giữ nó lại và áp dụng handler: trả object stub, đọc fixture, thay đổi response, hay chỉ ghi nhận. Quan trọng: phải khai báo intercept TRƯỚC khi hành động gây ra request, nếu không request đã bay đi. Bạn nên đặt intercept trong beforeEach hoặc ngay đầu it, trước cy.visit nếu request xảy ra lúc tải trang. URL matching hỗ trợ ký tự đại diện, ví dụ '**/api/projects*' để bắt cả query string.

js
// Khai báo TRƯỚC khi kích hoạt request
cy.intercept('GET', '**/api/projects*', { fixture: 'projects.json' }).as('list');
cy.visit('/dashboard');       // request xảy ra lúc tải trang
cy.wait('@list');             // chờ đúng request này rồi mới assert
cy.intercept thay thế cy.route cũ (đã bỏ). Nó chặn được cả fetch lẫn XHR, và cho phép can thiệp sâu vào req/res — mạnh hơn nhiều so với API đời trước.

3. Stub response: dựng dữ liệu xác định

Stub là trả về dữ liệu do bạn kiểm soát thay cho server. Điều này biến test thành xác định: cùng một đầu vào luôn cho cùng kết quả, không phụ thuộc dữ liệu thật đang thay đổi. Với dashboard SaaS, bạn có thể stub endpoint /api/projects để luôn trả về đúng 3 dự án với tên và trạng thái biết trước, rồi assert bảng hiển thị đúng 3 dòng. Bạn kiểm soát cả statusCode, headers, body và độ trễ. Stub đặc biệt hữu ích để test những trạng thái khó tái tạo với backend thật, như tài khoản vừa tạo chưa có dữ liệu, hay gói cước hết hạn.

js
it('hiển thị đúng số dự án từ API', () => {
  cy.intercept('GET', '**/api/projects*', {
    statusCode: 200,
    body: [
      { id: 1, name: 'Alpha',  status: 'active' },
      { id: 2, name: 'Beta',   status: 'paused' },
      { id: 3, name: 'Gamma',  status: 'active' },
    ],
  }).as('list');
  cy.visit('/dashboard');
  cy.wait('@list');
  cy.get('[data-cy="project-row"]').should('have.length', 3);
  cy.contains('[data-cy="project-row"]', 'Beta')
    .should('contain', 'paused');
});
🔒

Nội dung bị khoá

Bạn đang xem bản xem trước. Đăng nhập để mở khoá toàn bộ bài viết và tất cả tài liệu Tester/QA.

Đã xem 25% nội dung
  • Đọc trọn vẹn mọi bài viết
  • Lưu bài & ghi chú cá nhân
  • Theo dõi tiến độ đã đọc
  • Luyện phỏng vấn, ISTQB, Mock
Đăng nhập để đọc tiếp

Chưa có mã? Lấy mã qua Fanpage / Zalo CyberSoft.

0

💬 Bình luận (0)

Bạn có thể đọc mọi bình luận. Đăng nhập để bình luận

Chưa có bình luận nào. Hãy là người đầu tiên!