Jest 中的测试之间的模块变量不明确

问题描述

在测试两个修改相同状态变量 myVar函数时,我希望能够隔离似乎相关的副作用。

example.js

export function foobar() {
  sideEffect1();
  sideEffect2();
}

let myVar;

function sideEffect1() {
  if (myVar === undefined) {
    myVar = 'foo';
  }
}

function sideEffect2() {
  if (myVar === undefined) {
    myVar = 'bar';
  }
}

example.test.js

import example,{return2} from "../src/example";

test('Test Side Effect 1',() => {
  let se = example.__get__('sideEffect1');
  se();
  let myVar = example.__get__('myVar');
  expect(myVar).toBe("foo");
});


test('Test Side Effect 2',() => {
  let se = example.__get__('sideEffect2');
  se();
  let myVar = example.__get__('myVar');
  expect(myVar).toBe("bar");
});

输出

> jest "js/tests/example.test.js"

 FAIL  js/tests/example.test.js (6.056 s)
  ✓ Test Side Effect 1 (1 ms)
  ✕ Test Side Effect 2 (4 ms)

  ● Test Side Effect 2

    expect(received).toBe(expected) // Object.is equality

    Expected: "bar"
    Received: "foo"

      23 |   se();
      24 |   let myVar = example.__get__('myVar');
    > 25 |   expect(myVar).toBe("bar");
         |                 ^
      26 | });
      27 | 
      28 | 

如果我单独运行每个测试,两个都可以正常工作。问题似乎出在运行整个测试套件时。 这是我在更复杂的应用程序中使用的代码中遇到的相同问题的简化。任何想法为什么以及如何解决

babel.config.json

{
  "presets": ["@babel/preset-env"],"plugins": ["babel-plugin-rewire"]
}

解决方法

模块在执行开始时加载并作为一个加载 - 所以你的example.js被正确执行,无论哪个函数先执行sideEffect1sideEffect2这个函数设置变量{{1 }} 然后你得到这个变量值

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...