Is it possible to create Dynamic Tests in Cypress with functions containing cypress commands

Viewed 215

I'm trying to create multiple tests based off the number of functions in an array that I pass in, so that I can have one describe block and create tests as our project grows.

I've found multiple examples (here, real-world app examples) but all these examples create a simple array without any Cypress commands invoked. I need to pass in an array of functions that invoke Cypress (NOT Custom Commands) commands like cy.get()

What I'd like to work:

//loginPageController.js

export default class LoginPageController {
    thingOne() {
        cy.get('some things')
        expect(some assertion)
    }
    thingTwo() {
        cy.get('some other things')
        expect(another assertion)
    }
    getAllThings() {
        return [this.thingOne(), this.thingTwo()]
    }
}
//login.spec.js

import LoginPageController from '../../support/Controllers/loginPageController'
const lPC = new LoginPageController

    describe('Login Tests', function() {

        beforeEach(function() {
            cy.visit('myapp')
        })
        lPC.getAllThings().forEach(function() {
            it('tries each scenario', function() {
               // do stuff
            })
        })

Error message

The following error originated from your test code, not from Cypress.

  > Cannot call cy.get() outside a running test.

This usually happens when you accidentally write commands outside an it(...) test.

What I've tried

  1. it.forEach(getAllTheThings)('it should do the things', function(){})
  2. Setting the function as a variable in a before block const lPC.getAllThings() = allThings which actually just executes the function successfully in the before
  3. Aliasing/wrapping like cy.wrap(lPC.getAllThings()).as('allTheThings) (which is probably invalid but I'm just taking swings at this point)
  4. Using a fixture file but .js doesn't seem to be easily supported currently and I'll be passing in an array of functions, not a simple JSON object.

I'm just trying to keep things DRY and only write one describe that spits out as many tests as functions I include in that lPC.getAllThings()

0 Answers
Related