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