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 块中的数值?
通过查看笑话代码(文档没有多大帮助),传递给 beforeEach 的回调似乎是使用 done 回调参数调用的,这没有帮助。 (来源https://github.com/facebook/jest/blob/0e50f7313837bd005a560cb2161423ab06845733/packages/jest-circus/src/run.ts和https://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 使用相同代码进行多个测试)
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);
});
我做了这样的事情来让它工作
let accountType = "demo";
beforeEach(async () => {
...
});
describe("accountType: active", () => {
accountType = "active";
it("should be rendered component", () => {
...
});
});