GreenLake4964
GreenLake4964

Reputation: 776

Export reusable Javascript function in Cypress test spec file

I am trying to have a reusable component in my Cypress spec file, which is organized by our system 'services'. There are code pieces that I would like to make available as component for other JS files. However, I found the 'import' statement results in running of B.js's test cases, and I cannot find a way to avoid 'Testcase B' from running. I know there is custom commands in Cypress, but in my case, I would like to use pure JS to organize my component. Thank you.

enter image description here

A.js

import {functionInB as helloB } from "./B"

describe(`A`, () => {
    it(`01 Testcase A`, () => {
      let result = helloB()
      console.log(result)
    })
});

B.js

describe(`B`, () => {
  it(`01 Testcase B`, () => {
        //let result = Hello2()
        console.log("inside hello B")
    })
});

export function functionInB(){
  return "Do something in functionInB"
}

Upvotes: 1

Views: 1543

Answers (1)

Richard Matsen
Richard Matsen

Reputation: 23473

There doesn't seem to be a way to stop a script running on import (or require() or dynamic import()).

In Python __main__ (docs) is used to determine if a module is called at the "top level".

if __name__ == "__main__":
    # execute only if run as a script
    main()

It's a bit hacky, but you can use Cypress.spec.name to do the same thing and only run B's code when it is the current spec.

if (Cypress.spec.name === 'B.js') {

  describe(`B`, () => {
    it(`01 Testcase B`, () => {
        //let result = Hello2()
        console.log("inside hello B")
    })
  });

}

export function functionInB(){
  return "Do something in functionInB"
}

The "javascript way" would be to move functionInB() to a utility file and import in it both tests, but I guess you already know that.

Upvotes: 1

Related Questions