如何将变量从 test 传递到 beforeEach 钩子?

问题描述 投票:0回答:3
describe("SuiteName", () => {
  var numberArray =[1,2,3];

  beforeEach(async () => {
    //I want 'n' from test in this before each method
    console.log("Before Each" + expect.getState().currentTestName + 'number ' + n);
    
  });


    test.each(numberArray)("Tesst Name" , async (n) => {
    console.log("Current parameter is-> " + n);

  });
});

嗨,我是 Jest 新手,想了解如何获取 beforeeach 块中的数值?

arrays jestjs jasmine ts-jest
3个回答
4
投票

通过查看笑话代码(文档没有多大帮助),传递给 beforeEach 的回调似乎是使用 done 回调参数调用的,这没有帮助。 (来源https://github.com/facebook/jest/blob/0e50f7313837bd005a560cb2161423ab06845733/packages/jest-circus/src/run.tshttps://github.com/facebook/jest/blob/66629be6194f5e107a26f406180 a6ed597fb3c55/包/jest-circus/src/utils.ts

但这并不重要,因为在描述中 beforeEach 和测试共享相同的范围,并且在测试套件中,测试按顺序运行(没有对 testState 的重叠“并发”访问),因此这样做完全没问题:

describe("SuiteName", () => {
  const testState = { n: undefined };
  var numberArray =[1,2,3];

  beforeEach(async () => {
    //I want 'n' from test in this before each method
    console.log("Before Each" + expect.getState().currentTestName + 'number ' + testState.n);
    
  });

  numberArray.forEach(n => {
    console.log("Current parameter is-> " + n);
    testState.n = n;
    test('Tesst Name for n: ' + n, async () => {
      console.log("Current parameter is-> " + n);
    })
  });
});

问题是,通过将 test.each 拆分为共享相同代码的多个测试,您失去了 test.each 的一些好处。但使用 test.each 似乎没有办法解决这个问题。

或者,由于 test.each 和 beforeEach 的用例都可以防止重复代码并使测试更具可读性,为什么不将 beforeEach (异步)挂钩代码与实际测试链接起来:

describe("SuiteName", () => {
  var numberArray =[1,2,3];

  const forgetBeforeEachWeAreDoingTestEach = (n) => {
    return new Promise((resolve) => {
      //I want 'n' from test in this before each method
      console.log("Before Each" + expect.getState().currentTestName + 'number ' + n);
      resolve();
    });
  });

  test.each(numberArray)('Tesst Name', async (n) => {
    forgetBeforeEachWeAreDoingTestEach(n).then(() => {
        console.log("Current parameter is-> " + n);
    });
  });
});

我用 Promise 做了上述事情,因为我是老派,但大多数时候从一种到另一种的转换是非常简单的

可能只是:

await forgetBeforeEachWeAreDoingTestEach(n);
console.log("Current parameter is-> " + n);

注意这里之前的 stackoverflow 答案 提供了与 sinon.sandbox 的第一个解决方案 (testState) 类似的解决方案,但没有解决

test.each
问题(使用多个参数进行 1 个测试 VS 使用相同代码进行多个测试)


1
投票

expect.getState()
是内部API。 Jest 没有测试范围的上下文,它应该由开发人员处理。

beforeEach
函数在相应测试之前进行评估,并且不知道之后会发生什么。请注意,
beforeEach
是分层的,可以应用于不是从
numberArray
派生的测试。

在这种情况下,

beforeEach
没有可重用代码的好处。由于
each
函数对于所有这些测试都是通用的,因此它可以是:

  test.each(numberArray)("Tesst Name" , async (n) => {
    console.log("Before Each number ' + n);

    console.log("Current parameter is-> " + n);
  });

0
投票

我做了这样的事情来让它工作

  let accountType = "demo";
  beforeEach(async () => {
    ...
  });

  describe("accountType: active", () => {
    accountType = "active";
    it("should be rendered component", () => {   
        ...
    });
  });

© www.soinside.com 2019 - 2024. All rights reserved.