前後の機能がサイプレスで動作する方法について何か不足していると思います。前にフィクスチャからデータをロードするスペックファイルがあります。そのデータの一部は、以前の関数で、そして再び実際のテストでも使用されます。スペックファイルには2テストが含まれています。最初のテストは期待どおりに実行されます。納入時は、フィクスチャからの値の1つが未定義であると言っています。
私の期待は、前のメソッドのフィクスチャからデータをロードすると、SPECファイル内のすべてのテストで利用可能になる必要があります。
'butth bar'の状態を実行するときは、ownareeach関数のwindow.console.log(this.user_data)をテストしてください。
'送信フォーム'を実行するときは、ownedeach関数でwindow.console.log(this.user_data)を出力し、テストが停止します。
私はここで何を見逃していますか?
describe('Customer Profile', () => {
before(function () {
window.console.log('Enter the before function')
// Load the fixture data. Its asynchronous so if we want to use it right here and now
// we have to put the things that use inside a callback to be executed after the data
// loaded.
cy.fixture('user').as('user_data').then(function (){
window.console.log('Fixture has loaded the user data')
cy.visit('/LaunchPad/login')
// Fill out the login form
cy.get('input[name="username"]').type(this.user_data.username)
cy.get('input[name="password"]').type(this.user_data.password)
cy.get('button[type="submit"]').click()
})
})
beforeEach(function(){
window.console.log('Enter the beforeEach function')
window.console.log(this.user_data)
// Preserve the cookies for all tests in this suite
Cypress.Cookies.preserveOnce('SESSION')
// Open the profile view
cy.visit('/Manager/'+this.user_data.org+'/config/company-profile')
})
it('Check the state of the button bar', function(){
window.console.log('Running test of button bar')
cy.get('section.content-header > h1').contains('Company Profile Details')
// Check the state of the action bar and its buttons
cy.get('section.action-bar').get('label.btn.btn-sm.btn-primary').contains('Save')
.should('have.attr', 'for', 'submit-form')
.should('have.attr', 'tabindex', '0')
cy.get('section.action-bar').get('#resetButton').contains('Reset')
.should('have.attr', 'type', 'reset')
.should('have.attr', 'value', 'Reset')
.should('have.class', 'btn btn-sm btn-default')
cy.get('section.action-bar').get('a.btn.btn-sm.btn-default').contains('Cancel')
.should('have.attr', 'href', '/Manager/'+this.user_data.org+'/')
cy.get('section.action-bar').get('a').contains('Delete').should('not.exist')
})
// This form has no required fields and no validation. So just pick a value or two
// submit the form and verify the banner is correct
it('Submit form', function(){
window.console.log('Running the submit form test')
cy.fixture('company_profile').as('company_profile')
cy.get('#companyProfileDto.name').type(this.company_profile.name)
})
})
_
[〜#〜]更新[〜#〜] Carlos Alfredoが何を基準にしてもっと読んだ後、私はこれを思い付きました。 1.私はまだログインページを訪問する必要があります。私たちはCSRFと宣誓を使い、実行している例を得ることを試みることはただ時間がかかりすぎることです。 2. PreserveOnceがまったく機能しないため、セッションCookieのホワイトリストを使用する必要があります。
これが私が今持っているファイルです。一度ログインページを訪問し、セッションCookieセットアップを取得します。 2つのテストは予想通りに進行します。
サポート/ index.js
before(function(){
cy.login('bob', 'password')
cy.fixture('user').as('user_data')
cy.fixture('company_profile').as('company_profile')
})
beforeEach(function(){
window.console.log('Enter the global beforeEach function')
// Load the fixture data
})
_
サポート/ commands.js
/*
We visit the login form despite what the best practise recommendation is because
we have OAUTH redirects and a CSRF token to deal with. Since the majority of the
examples and working use cases provided dont deal with those scenarios this is
the best I can do at the moment.
*/
Cypress.Commands.add('login', (username, password, options = {}) => {
cy.visit('/LaunchPad/login')
// Fill out the login form
cy.get('input[name="username"]').type(username)
cy.get('input[name="password"]').type(password)
cy.get('button[type="submit"]').click()
})
/*
We are white listing the cookie because Cypress.Cookies.preserveOnce('SESSION')
does not work. https://github.com/cypress-io/cypress/issues/2952
Because we are forcing Cypress to not clear the cookies, you will have to close
the test window after the suite is completed other wise the Vision360 apps will
think your session is alive.
*/
Cypress.Cookies.defaults({
whitelist: 'SESSION'
})
_
統合/ customer_profile/customer_profile_spec.js.
describe('Customer Profile', () => {
it('Check the state of the button bar', function(){
window.console.log('Running test of button bar')
cy.visit('/Manager/'+this.user_data.org+'/config/company-profile')
cy.get('section.content-header > h1').contains('Company Profile Details')
// Check the state of the action bar and its buttons
cy.get('section.action-bar').get('label.btn.btn-sm.btn-primary').contains('Save')
.should('have.attr', 'for', 'submit-form')
.should('have.attr', 'tabindex', '0')
cy.get('section.action-bar').get('#resetButton').contains('Reset')
.should('have.attr', 'type', 'reset')
.should('have.attr', 'value', 'Reset')
.should('have.class', 'btn btn-sm btn-default')
cy.get('section.action-bar').get('a.btn.btn-sm.btn-default').contains('Cancel')
.should('have.attr', 'href', '/Manager/'+this.user_data.org+'/')
cy.get('section.action-bar').get('a').contains('Delete').should('not.exist')
})
// This form has no required fields and no validation. So just pick a value or two
// submit the form and verify the banner is correct
it('Submit form', function(){
window.console.log('Running the submit form test')
cy.visit('/Manager/'+this.user_data.org+'/config/company-profile')
// Fill and submit the form
cy.get('input#companyProfileDto\\.name').clear().type(this.company_profile.name)
cy.get('section.action-bar').get('label.btn.btn-sm.btn-primary').contains('Save').click()
// Check the response
cy.get('.callout-success').contains('Your changes are saved.')
cy.get('input#companyProfileDto\\.name').should('have.value', this.company_profile.name)
})
})
_
各テストのfixtures
を清掃しているように見えます。
サイプレスガイドから( https://docs.cypress.io/guides/References/BEST-practices.html#dangling-State-IS-Your-Friends )))
「私たちはこのユースケースをサポートするためのサイプレスを建てました。実際、テストが終了すると、サイプレスは独自の内部状態を片付けていません。テストの終わりにダングリング状態があります。スパイ、偶数ルートのようなものテストの最後には削除されません。これは、Cypressコマンドを実行している間、またはテスト終了後に手動で動作しているときに、アプリケーションが同じように動作することを意味します。」
そのページでfixtures
について明示的なものは何もありませんが、その起動のように見え、fixtures
も清掃されます。 beforeEach()
は、before()
の後に正確に実行されるため、最初のテストで動作します(ボタンバーの状態を確認してください)。 before
フックに設定されている2回目のテストのために、beforeEach()
が定義されていない備品を取得しようとしています。
それが役に立てば幸い。
あなたのおそらくあなたの提案: - 要求だけを使って、UIをスキップするカスタムコマンドとしてあなたのログインをすることをお勧めします。( https://docs.cypress.io/api/ cypress-api/custom-commands.html#custom-login-command )
私は前にあなたのものとほぼ同じ問題に遭遇しました。
before()
次のコードブロックの前に実行されます。
_describe("Some test", function() {
before(function() {
//something ...
cy.request('POST', loginUrl, loginInformation).its('body').as('currentUser')
})
// this.currentUser exists here
it("Should foo", function() {
})
// this.currentUser doesn't exist here
it("Should bar", function() {
})
})
_
Describe Scopeからbefore()
ステートメントを移動する問題を修正しました。
_before(function() {
//something ...
cy.request('POST', loginUrl, loginInformation).its('body').as('currentUser')
})
describe("Some test", function() {
// this.currentUser exists here
it("Should foo", function() {
})
// this.currentUser also exists here
it("Should bar", function() {
})
})
_
これがあなたがあなたの問題を解決するのを助けることができることを願っています。
セッションクッキーのセットを保存した場合、最速の方法では、それらをハードコード/ブリュートフォースにしてください。
beforeEach(() => {
Cypress.Cookies.preserveOnce('SESSION') // remember cookies for this session:
cy.setCookie('logged_in_cookie_name', '000000000000000000000') // hard coded session cookie
cy.setCookie('security_salt_etc', '000000000000000000000') // its like a revokable password but more secure
})
after(() => { // logout!
cy.clearCookies()
})
_