Jestjs 如何在Jest中运行每个请求都有多个测试的并发测试?

Jestjs 如何在Jest中运行每个请求都有多个测试的并发测试?,jestjs,Jestjs,我希望同时运行Jest测试,但有一个场景存在问题: 我在一个端点上测试结果,我想测试它的多个方面。因此,在beforeAll函数中,我发出请求并存储响应,然后在多个测试中测试响应。这可以很好地同步工作,但是当我使测试并发时,它不再允许您将变量传递到测试中,因此这是不可能的。或者,我可以将请求放在测试本身中,然后对响应进行许多预期,但是如果某个响应失败,我没有足够的粒度来查看出了什么问题 对于这种情况有什么解决方案吗 这项工作: let data; beforeAll(async () =>

我希望同时运行Jest测试,但有一个场景存在问题:

我在一个端点上测试结果,我想测试它的多个方面。因此,在beforeAll函数中,我发出请求并存储响应,然后在多个测试中测试响应。这可以很好地同步工作,但是当我使测试并发时,它不再允许您将变量传递到测试中,因此这是不可能的。或者,我可以将请求放在测试本身中,然后对响应进行许多预期,但是如果某个响应失败,我没有足够的粒度来查看出了什么问题

对于这种情况有什么解决方案吗

这项工作:

let data;
beforeAll(async () => {
    data = await getDataFromRequest();
}
it('value1 should be truthy', () => {
    expect(data.value1).toBeTruthy();
}
it('value2 should be truthy', () => {
    expect(data.value2).toBeTruthy();
}
这也适用于:

it.concurrent('data should have correct values', async () => {
    const data = await getDataFromRequest();
    expect(data.value1).toBeTruthy();
    expect(data.value2).toBeTruthy();
}
但我想要的是:

let data;
beforeAll(async () => {
    data = await getDataFromRequest();
}
it.concurrent('value1 should be truthy', () => {
    expect(data.value1).toBeTruthy();
}
it.concurrent('value2 should be truthy', () => {
    expect(data.value2).toBeTruthy();
}

似乎值得指出的是,在一个笑话中也有关于这一点的讨论:

要点:它不是那样工作的,也不是计划好的。可能的解决办法:

const dataPromise = getSomeDataPromise();

test.concurrent('one', async () => {
  const data = await dataPromise;
});

test.concurrent('two', async () => {
  const data = await dataPromise;
});

与Playwright一起进行浏览器测试时遇到了相同的问题,其中一个测试套件只需要一个浏览器实例。必须用
setInterval
的承诺来包装它。在您的情况下,应如下所示:

let数据;
之前(异步()=>{
数据=等待getDataFromRequest();
}
test.concurrent('value1应该是truthy',async()=>{
等待waitForData();
expect(data.value1).toBeTruthy();
}
test.concurrent('value2应该是truthy',async()=>{
等待waitForData();
expect(data.value2).toBeTruthy();
}
/**
*@param{number}interval-检查数据可用性的时间间隔
*@param{number}timeout-总超时值
*@返回您的数据承诺,或在超时时拒绝。
*/
函数waitForData(间隔=500,超时=5000){
设acc=0;//时间累计
返回新承诺((解决、拒绝)=>{
常数i=设置间隔(()=>{
acc+=间隔;
如果(数据){
间隔时间(i);
解析(数据);
}
如果(acc>超时){
间隔时间(i);
拒绝();
}
},间隔);
});
}

因此,您只需分配适当的检查间隔和超时时间,这应该足够长,您的数据
asycn
调用就可以返回。

您有没有发现这个问题?我最近自己也遇到过这个问题。.我想这就是为什么这里没有记录
test.concurrent()