为什么不能在测试代码中获取globalSetup中设置的全局变量?

时间:2018-01-11 13:49:26

标签: jestjs

我使用Jest在节点中进行单元测试 我使用了Jest v22中的新功能globalSetup 我在globalSetup中定义了一个全局变量 但我无法在测试代码中得到它。控制台日志未定义。
这个问题的任何人?
感谢。

Jest版本:22.0.0
节点版本:8.9.0
纱线版本:1.3.2
操作系统:mac High Sierra 10.13.2

代码如下:

// package.json
{
  "jest": {
    "globalSetup": "<rootDir>/src/globalSetupTest.js"
  }
}

// globalSetupTest.js
module.exports = async function() {
  global.foo = 'foo';
  console.log(`global setup: ${global.foo}`);
};

// App.test.js
describe('APP test', () => {
  it('renders without crashing', () => {
    console.log({ foo: global.foo });
  });
});

// test result
yarn run v1.3.2
$ node scripts/test.js --env=node --colors
global setup: foo
 PASS  src/App.test.js
  APP test
    ✓ renders without crashing (5ms)

  console.log src/App.test.js:3
    { foo: undefined }

Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        0.354s, estimated 1s
Ran all test suites.

3 个答案:

答案 0 :(得分:1)

据我了解,这是Jest的设计决策,因为在不同测试之间共享状态被认为是一种不好的做法。测试并行运行,它们应该保持自己的状态。

请参阅: https://github.com/facebook/jest/issues/6007#issuecomment-381743011 https://github.com/facebook/jest/issues/4118

答案 1 :(得分:1)

Jest人自己提供了一个解决方案:https://jestjs.io/docs/en/puppeteer.html。请注意,如果您使用的是CRA,则无法立即使用(下面的解决方案),因为它目前不支持Jest的testEnvironment选项。

无论如何:

  • 在Jest配置文件中,您设置了指向全局设置,拆卸和测试环境脚本的路径
  • 在全局设置脚本中,您创建一个浏览器并将其WSEndpoint写入文件中
  • 在全局拆卸脚本中,您只需关闭浏览器
  • 在testEnvironment脚本中,您从之前保存的文件中读取WSEndpoint,然后使用它连接到正在运行的浏览器-此后,通过使用全局变量,浏览器可用于您的测试中

如果您使用的是CRA,则可以对这些测试使用自定义设置,然后完全单独运行它们。而且,如果您要使用Puppeteer进行e2e测试,那么无论如何,这可能就是您想要做的。

您只需将另一个脚本添加到package.json:"test:e2e": "jest -c ./jest-e2e.config.js"中,然后根据需要进行设置。现在,您将拥有npm run test的单元测试和npm run test:e2e的端到端测试。

答案 2 :(得分:0)

你能试试..

  global.foo = 'foo';
  console.log(`global setup: ${global.foo}`);

(删除导出)

您可以尝试将globalSetup更改为setupFiles。那一个,不会指望一个功能。

https://facebook.github.io/jest/docs/en/configuration.html#setupfiles-array