Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I save a value in global in Jest during test setup?

Tags:

jestjs

I have a global setup in Jest.

"jest": {
    "globalSetup": "./setup.js"
  }

Within the setup, I have an async function which writes a session key to global

const axios = require('axios');

async function getSessionKey() {
    const response = await axios.post("http://apiUrl", {
        username: "K",
        password: "passw0rd"
    });
    sessionKey = response.data.sessionKey;
    global.sessionKey = sessionKey;
}

module.exports = getSessionKey;

Whatever session key I am saving in global is not available in the test file. global.sessionKey is undefined in the below test.

test("create session", () => {
    expect(global.sessionKey).toBeTruthy();
});

I want some way to set the sessionKey in a global object from setup file. The session key should be available before I run any of my tests.

like image 1000
vijayst Avatar asked Jan 30 '18 14:01

vijayst


2 Answers

globalSetup/globalTeardown can't be used to inject context/global variables to sandboxed test suites/files. Use setupFiles/setupFilesAfterEnv instead.

Other way you can customize the test runtime through testEnvironment, more details see here: Async setup of environment with Jest

like image 160
lxyyz Avatar answered Oct 29 '22 11:10

lxyyz


I spend a lot of time figuring this out right. The only fully working solution was using testenvironments. This supports async functions as well as globals properly. Each test suite uses a separate instance of the testenvironment.

const NodeEnvironment = require('jest-environment-node');

class TestEnvironment extends NodeEnvironment {
  constructor(config) {
    super(config);
  }

  async setup() {
    await super.setup();
    this.global.db = await asyncCode();
  }

  async teardown() {
    this.global.db = null;
    await asyncCode2();
    await super.teardown();
  }

  runScript(script) {
    return super.runScript(script);
  }
}

module.exports = TestEnvironment;

I added a reference to this file in the Jest Config: "testEnvironment": "./testEnvironment" for the file testEnvironment.js

I'm not sure though why there are so many different config options like setupFiles, globals, testEnvironment, ...

like image 26
Florian Richter Avatar answered Oct 29 '22 11:10

Florian Richter