Lệnh đăng nhập Cypress với cy.request khiến cy.visit tiếp theo không thành công


8

Tôi đang cố gắng đăng nhập theo chương trình với Cypress trước mỗi bài kiểm tra. Mã thông báo của tôi vẫn tồn tại trong localStorage. Nếu tôi thay đổi nó một cách đồng bộ, tức là làm simpy localStorage.setItemmà không liên quan đến cy.requestnó hoạt động tốt. Tuy nhiên, tôi muốn sử dụng máy chủ xác thực của mình ( http://localhost:3004/loginbên dưới) để tạo mã thông báo.

Mã thông báo được tìm nạp chính xác từ máy chủ, nhưng ngay sau khi tôi sử dụng lệnh bên dưới cùng với cy.visit('/')tôi nhận được "Không thể truy cập localhost: 8080 - Chúng tôi đã cố gắng thực hiện một yêu cầu http đến URL này nhưng yêu cầu không thành công mà không có phản hồi" (xem nhật ký đầy đủ bên dưới).

Theo như tôi có thể nói, đây là cách tiếp cận chính xác khi sử dụng máy chủ xác thực để xác thực không đầu. Tôi đã bỏ lở những gì?

Command.js

Cypress.Commands.add('login', () => {
  cy.request({
    method: 'POST',
    url: `http://localhost:3004/login`,
    body: {
      username: 'foo@bar.com',
      password: '123'
    }
  }).its('body').then((body) => {
    const vuexData = { user: { authenticationData: { token: body.token } } }
    window.localStorage.setItem('vuex', JSON.stringify(vuexData))
  })
})

test.js

describe('A test', () => {
  beforeEach(() => {
    cy.login()
  })

  it('works', () => {
    cy.visit('/')
    cy.get('h1').contains('All Books')
  })
})

CypressError: cy.visit () không tải được:

http: // localhost: 8080 /

Chúng tôi đã cố gắng thực hiện một yêu cầu http đến URL này nhưng yêu cầu không thành công mà không có phản hồi.

Chúng tôi đã nhận được lỗi này ở cấp độ mạng:

Lỗi: kết nối ECONNREFUSED :: 1: 8080

Các tình huống phổ biến tại sao điều này sẽ thất bại: - bạn không có quyền truy cập internet - bạn quên chạy / khởi động máy chủ web của mình - máy chủ web của bạn không thể truy cập - bạn có các cài đặt cấu hình mạng kỳ lạ trên máy tính của mình

Theo dõi ngăn xếp cho lỗi này là:

Lỗi: kết nối ECONNREFUSED :: 1: 8080 tại TCPConnectWrap.afterConnect [as oncomplete] (net.js: 1056: 14)


Bạn đã đặt đúng baseUrl trong cypress.json chưa?
Josef Biehler

@JosefBiehler Vâng, http://localhost:8080nó hoạt động tốt mà không cần cy.requestlệnh đăng nhập
Johan

1
Thất bại điều tương tự
Cây Nguyễn

1
Nếu tôi sử dụng một phiên bản generic của mã của bạn, đăng nhập vuexData trong .its('body').then((body), it('works', () => {và các ứng dụng Vue mounted()họ đều có giá trị chính xác và bản ghi xảy ra theo đúng thứ tự (đánh typicode với POST). Điều duy nhất tôi có thể đề nghị là đăng nhập bodysau POST và xem nó có đúng mẫu không. Mặt khác, ứng dụng Vue sử dụng mã thông báo như thế nào?
Richard Matsen

2
Tôi đã thiết lập một ứng dụng ví dụ như bạn đã mô tả và Cypress hoạt động hoàn hảo. Mã thông báo được ghi vào bộ nhớ cục bộ trước bất kỳ cuộc gọi đến dịch vụ nào trên 8080. Bạn có chắc chắn không có vấn đề gì trong ứng dụng của bạn chạy trên 8080. Thay thế ứng dụng của bạn bằng tệp index.html đơn giản bằng tiêu đề h1 hiện tại (hoặc không) và thử lại - vượt qua bài kiểm tra.
jeeves

Câu trả lời:


-1

Đôi điều. Tôi chưa bao giờ sử dụng cypressnhưng bất kỳ cuộc gọi mạng nào sẽ không đồng bộ. Không có chức năng nào của bạn ở trên trả về những lời hứa được tạo từ các chức năng của bạn. Vì vậy, nơi bạn tạo loginlệnh của bạn . Bạn cần trả lại lời hứa từ chức năng đó và bạn cần chờ đợi nó trong beforeEachchức năng của mình . Có thể là nguyên nhân của vấn đề của bạn, có thể không.

Có thể bạn có một lỗi trong ứng dụng của bạn khi bạn hết thời gian vì bạn có một yêu cầu không được xác thực đối với dịch vụ đang chạy trên cổng 8080. Nhìn vào mã khi nó đứng, bạn sẽ gọi visit(bài kiểm tra của bạn) trước khi bạn beforeEachhoàn thành. Rất có khả năng dữ liệu không có trong bộ nhớ cục bộ vào thời điểm bạn đạt được bài kiểm tra của mình.

Đọc nhanh qua tài liệu trên cypress, có vẻ như cypresscố gắng tìm ra nơi dịch vụ của bạn được đặt. Một thứ khác mà nó trông giống như là nó nối thêm url được xác định trong requestbaseUrl được cấu hình. Bạn có thực sự thấy yêu cầu xác thực xuất hiện trên dịch vụ xác thực của mình không?


2
Về async, thông thường bạn đúng, nhưng AFAIK, các yêu cầu cây bách chạy theo trình tự mà không có await, xem ví dụ ở đây tương tự như trường hợp của tôi: docs.cypress.io/api/cypress-api/ . Điểm hay về URL mặc dù, sẽ kiểm tra xem
Johan

Xem nhận xét của tôi ở trên, thay thế ứng dụng của bạn bằng một trang html đơn giản và chạy lại bài kiểm tra đó, nếu nó vượt qua, đó là một vấn đề với ứng dụng của bạn không phải là cây bách.
jeeves
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.