cy.requestを含むサイプレスログインコマンドにより、後続のcy.visitが失敗する


8

各テストの前にサイプレスでプログラムによるログインを試みています。私のトークンはlocalStorageに保持されます。私がそれを同期的に変更する場合、つまり、localStorage.setItem関与せずに行う単純cy.requestな動作は正常に機能します。ただし、http://localhost:3004/loginトークンを生成するために私の認証サーバー(以下)を使用したいと思います。

トークンはサーバーから正しくフェッチされますが、以下のコマンドを使用してcy.visit('/')「localhost:8080にアクセスできませんでした-このURLにhttpリクエストを送信しようとしましたが、リクエストが応答なしで失敗しました」(以下の完全なログ)。

私の知る限り、これはヘッドレス認証に認証サーバーを使用する場合の正しいアプローチです。私は何を取りこぼしたか?

commands.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()が読み込もうとして失敗しました:

http:// localhost:8080 /

このURLにhttpリクエストを送信しようとしましたが、リクエストが応答なしで失敗しました。

ネットワークレベルでこのエラーを受け取りました:

エラー:ECONNREFUSED :: 1:8080を接続します

これが失敗する一般的な状況:-インターネットにアクセスできない-Webサーバーを実行または起動するのを忘れた-Webサーバーにアクセスできない-コンピューターに奇妙なネットワーク構成設定がある

このエラーのスタックトレースは次のとおりです。

エラー:ECONNREFUSED :: 1:8080をTCPConnectWrap.afterConnectに接続します[oncompleteとして](net.js:1056:14)


baseUrl cypress.jsonに正しい値を設定しましたか?
Josef Biehler

@JosefBiehlerはい、ログインコマンドでをhttp://localhost:8080使わなくても正常に機能cy.requestします
Johan

1
同じことを失敗させる
ツリーグエン

1
私は内vuexDataをログに記録する、あなたのコードのジェネリック版を使用している場合は.its('body').then((body)it('works', () => {、とVueのアプリはmounted()、彼らがすべて正しい値とログを持って正しい順序(POSTとtypicodeを打つ)で発生します。私が提案できる唯一のことはbody、POST後にログを記録し、正しい形式であるかどうかを確認することです。それ以外の場合、Vueアプリはどのようにトークンを使用しますか?
Richard Matsen

2
私はあなたが説明したようにサンプルアプリをセットアップしました、そしてサイプレスは完全に動作します。トークンは、8080でサービスを呼び出す前にローカルストレージに書き込まれます。8080で実行中のアプリに問題がないことを確認してください。h1ヘッダーが存在する(または存在しない)シンプルなindex.htmlファイルでアプリを置き換えて、再試行してください-テストを実行します。
jeeves

回答:


-1

いくつかのこと。私は使用しcypressたことがありませんが、ネットワークコールは非同期になります。上記の関数は、関数から生成されたpromiseを返していません。loginコマンドを作成する場所です。その関数からpromiseを返す必要があり、関数でそれを待つ必要がありますbeforeEach。問題の原因かもしれませんが、そうではないかもしれません。

ポートで実行されているサービスへの認証されていないリクエストがあるため、タイムアウトしているアプリケーションにバグがある可能性があります8080。現状のコードを見ると、完了するvisit前に(テスト)を呼び出すことになりますbeforeEach。テストに到達するまでに、データがローカルストレージに存在しない可能性が非常に高くなります。

のドキュメントをざっと読んでみると、サービスの場所を特定しようとしcypressているように見えcypressます。もう1つは、request設定されたbaseUrlにで定義されたURLを追加することです。実際に認証リクエストが認証サービスに送られるのを見ますか?


2
非同期に関しては、通常、あなたは正しいですが、AFAIK、サイプレスリクエストはなしで順番に実行されます。await私のケースに似ているここの例を参照してください:docs.cypress.io/api/cypress-api/…。しかし、URLの良い点は、確認することです
Johan

上記の私のコメントを参照して、アプリを単純なhtmlページに置き換えてテストを再実行してください。合格した場合は、ヒノキではなくアプリに問題があります。
jeeves
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.