Jestjs 为什么可以';t获取在测试代码的globalSetup中设置的全局变量?

Jestjs 为什么可以';t获取在测试代码的globalSetup中设置的全局变量?,jestjs,Jestjs,我使用Jest在节点中进行单元测试。 我使用的新功能是在22版中推出的。 我在中定义了一个全局变量。 但是我不能在测试代码中得到它。控制台日志未定义。 有人问这个问题吗? 谢谢 笑话版本:22.0.0 节点版本:8.9.0 纱线版本:1.3.2 操作系统:mac High Sierra 10.13.2 代码如下: // package.json { "jest": { "globalSetup": "<rootDir>/src/globalSetupTest.js"

我使用Jest在节点中进行单元测试。
我使用的新功能是在22版中推出的。
我在中定义了一个全局变量。
但是我不能在测试代码中得到它。控制台日志未定义。
有人问这个问题吗?
谢谢

笑话版本: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.
//package.json
{
“笑话”:{
“globalSetup”:“/src/globalSetupTest.js”
}
}
//globalSetupTest.js
module.exports=异步函数(){
global.foo='foo';
log(`global setup:${global.foo}`);
};
//App.test.js
描述('应用程序测试',()=>{
它('渲染而不崩溃',()=>{
log({foo:global.foo});
});
});
//测试结果
纱线运行v1.3.2
$node scripts/test.js--env=node--colors
全局设置:foo
通过src/App.test.js
应用程序测试
✓ 渲染而不崩溃(5ms)
console.log src/App.test.js:3
{foo:undefined}
测试套件:1个通过,共1个
测试:1项通过,共1项
快照:共0个
时间:0.354s,估计1s
运行所有测试套件。
你能试试吗

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

您可以尝试将全局设置更改为设置文件。那个,不需要函数


因为我所理解的是一个玩笑的设计决策,因为在不同的测试中共享状态被认为是一种不好的做法。测试并行运行,它们应该保持自己的状态

见:
开玩笑的人自己提供了一个解决方案:。请注意,如果您使用CRA,这将无法开箱即用(下面的解决方案),因为它目前不支持Jest的TestenEnvironment选项

无论如何:

  • 在Jest配置文件中,您可以设置全局设置、拆卸和测试环境脚本的路径
  • 在全局设置脚本中,创建浏览器并将其WSEndpoint写入文件
  • 在全局拆卸脚本中,只需关闭浏览器
  • 在TestenEnvironment脚本中,从之前保存的文件中读取WSEndpoint,然后使用它连接到正在运行的浏览器-在此之后,通过使用全局变量,可以在测试中使用浏览器
如果您使用的是CRA,您可以为这些测试使用自定义设置,并完全单独运行它们。如果您正在使用Puppeter进行e2e测试,这可能是您想要做的


您只需将另一个脚本添加到package.json:
“test:e2e”:“jest-c./jest-e2e.config.js”
,并根据需要进行设置。现在,您将有用于单元测试的
npm运行测试
,以及用于端到端测试的
npm运行测试:e2e

我正在努力解决同样的问题。当我删除
模块导出
时,测试将出现错误:
类型错误:require(…)不是函数
我认为
globalSetup
必须导出函数,否则将失败。请更改设置文件的全局设置。看看我的答案。那也许行,谢谢你。是的,设置文件是可以的。但是setupfile将在每次测试之前运行。我想使用globalSetup,因为它在所有测试之前只运行一次。谢谢。我的场景是使用jest运行node.js单元测试,我想在运行所有测试之前创建测试db环境,并在所有测试运行之后删除db。也许这和使用木偶演员有点不同。你可以在没有测试环境的情况下尝试上面的方法,因为你不需要它。