Leopard Tanks
Leopard Tanks

Reputation: 181

Turn off clearing aliases in Cypress test

We have a number of variables from the API which are used throughout the tests. The values are saved to aliases at various points.

How can we turn off clearing aliases between test?

If we use one big test this works fine but Cypress by default clears aliases between tests, so as we break down the tests into smaller more manageable units we are breaking the code.

Simple example:

before(() => {
  cy.wrap(123).as('alias')
})

it('test1', () => {
  // alias is usable here
  cy.get('@alias').should('eq', 123)    
  cy.wrap(456).as('alias2')
});

it('test2', () => {
  // alias is missing here
  cy.get('@alias').should('eq', 123)    
  cy.get('@alias2').should('eq', 456)  
});

Upvotes: 7

Views: 1685

Answers (2)

Fseee
Fseee

Reputation: 2627

According to cypress doc

aliases and properties are automatically cleaned up after each test

so with current cypress versions your goal is not achievable.

As a workaround you could use cypress.env as a storage for your tests:

Cypress.env(varName, varValue)

and using a test0 to reset all variables before each texts execution:

it('test0', () => {
  // clean up all stored aliases
  cy.env("var1",null);
  cy.env("var2",null);
  //...
});

Upvotes: -1

Fody
Fody

Reputation: 32118

There's no configuration to turn off alias cleardown.

You would have to create a custom command to do it.

Cypress.Commands.add('keepAliases', function(aliasList) {
  if (!aliasList) {
    aliasList = Object.keys(this)
      .filter(key => !['test', '_runnable', 'currentTest']
      .includes(key))
  }
  aliasList.forEach(key => {
    cy.wrap(this[key]).as(key)
  })
})

Usage for a single test

before(() => {
  cy.wrap(123).as('alias')
})

it('test1', () => {
  cy.get('@alias').should('eq', 123)    
  cy.wrap(456).as('alias2')
});

// ✅ test passes 
it('test2', () => {
  cy.keepAliases()
  cy.get('@alias').should('eq', 123)  
  cy.get('@alias2').should('eq', 456)
});

Usage for all tests

before(() => {
  cy.wrap(123).as('alias')
})

beforeEach(() => {
  cy.keepAliases()
})

it('test1', () => {
  cy.get('@alias').should('eq', 123)    
  cy.wrap(456).as('alias2')
});

// ✅ test passes 
it('test2', () => {
  cy.get('@alias').should('eq', 123)  
  cy.get('@alias2').should('eq', 456)
});

Upvotes: 6

Related Questions