Jestjs 会开玩笑';在它的描述范围之前等待它的执行?

Jestjs 会开玩笑';在它的描述范围之前等待它的执行?,jestjs,Jestjs,在过去的几天里,我一直被Jest在descripe块中如何处理之前的感到困惑。我希望每个description之前的只在description内部运行测试时执行 我已经编写了这个测试文件(测试文件?): 异步函数wait1sec(){ 返回新承诺(resolve=>setTimeout(resolve,1000)); } 异步函数logWait(i,isdescripe=false){ log(`before wait inside${isdescripe?'descripe':'it'}#`+

在过去的几天里,我一直被Jest在
descripe
块中如何处理
之前的
感到困惑。我希望每个
description
之前的
只在
description
内部运行测试时执行

我已经编写了这个测试文件(测试文件?):

异步函数wait1sec(){ 返回新承诺(resolve=>setTimeout(resolve,1000)); } 异步函数logWait(i,isdescripe=false){ log(`before wait inside${isdescripe?'descripe':'it'}#`+i); 等待wait1sec(); log(`after wait inside${isdescripe?'descripe':'it'}#`+i); 期望值(真)。toEqual(真); } 函数logSync(i,isBefore=false){ log('synchronous function${isBefore?'before':'it'}{i}`); } 描述('异步行为',()=>{ 描述('块1',()=>{ 常数i=1; 之前(()=>logSync(i,true)); 它(‘块1中的同步测试’,()=>logSync(i)); }); 描述('块2',()=>{ 常数i=2; 之前(()=>logSync(i,true)); 它(‘块1中的同步测试’,()=>logSync(i)); }); });
您可以看到我在异步行为的上下文中测试这一点的残余事实,但事实证明,即使没有异步,它也令人困惑

我希望得到的是:

synchronous function before #1
synchronous function it #1
synchronous function before #2
synchronous function it #2
我真正得到的是

synchronous function before #1
synchronous function before #2
synchronous function it #1
synchronous function it #2
更糟糕的是,如果我跳过第二个块(使用
xdescripe
),那么之前的第二个
仍然会运行

所以我想这并没有那么令人困惑,我想这只是很清楚它是如何工作的,这不是我想要的工作方式

除了简单地将我的“beforeAll”代码放在块的第一个测试中之外,还有什么方法可以得到我想要的结果吗


注意:在一些上下文中,我使用这些测试与外部RESTAPI交互,以测试我如何设置工作流。换句话说,我不是在测试我自己的代码,所有与服务器的交互都是真实的,并导致真实的CRUD事务。它们并不重要,而且很容易清理,所以这是一件安全可控的事情。我的测试是相互构建的,从一个
description
到下一个(即,我正在使用的页面在第一个测试之前创建一次,并在其余的测试中使用RESTAPI进行修改)这意味着在
descripe
#1中的测试之前运行
descripe
#2中的
之前的
可能会把整个事情搞砸。(特别是当我试图用
xdescripe
!)跳过块时)

您可以使用它按顺序运行测试
您还可以将描述块包装到IIFE中(或为此添加函数):

description('async behavior',()=>{
(() =>
描述('块1',()=>{
...
}))();
(() =>
描述('块2',()=>{
...
}))();
});

它会像你期望的那样工作,但我不确定这是否是一个好的做法。也许这种方式会为其他异步行为创建一些其他逻辑错误

这种有状态的集成测试通常是不被鼓励的,所以这是框架没有涵盖的边缘情况。我不确定是否有记录,但这是可以预料的。beforeAll和beforeach保证在测试之前运行,并且它们会这样做。此外,如果测试失败,测试将不会停止,即使有
bail
,这是一个已知的笑话陷阱,可能也不适合您的情况。对于您想要做的事情,只需将另一个
it
添加到执行设置的开始部分,并确保为有状态测试启用
bail
。似乎即使在“正确”(无状态)测试环境中,仅在执行其块之前运行的
beforeAll
也不会是边缘情况?我想我一定是错了。