跳转到主要内容
版本:25.倍

安装和拆卸

通常,在编写测试时,您需要在测试运行之前进行一些设置工作,并在测试运行之后进行一些完成工作。Jest提供了处理这个问题的亚搏取款helper函数。

为许多测试重复设置#

如果你有一些工作需要在许多测试中重复做,你可以使用beforeEachafterEach

例如,假设有几个测试与城市数据库交互。你有一个方法initializeCityDatabase ()必须在每个测试之前调用,以及一个方法clearCityDatabase ()必须在每个测试之后调用。你可以这样做:

beforeEach ( ( ) = > {
initializeCityDatabase ( ) ;
} ) ;
afterEach ( ( ) = > {
clearCityDatabase ( ) ;
} ) ;
测试 ( “城市数据库有维也纳” , ( ) = > {
预计 ( isCity ( “维也纳” ) ) toBeTruthy ( ) ;
} ) ;
测试 ( “城市数据库有圣胡安” , ( ) = > {
预计 ( isCity ( “圣胡安” ) ) toBeTruthy ( ) ;
} ) ;

beforeEachafterEach可以以相同的方式处理异步代码测试可以处理异步代码-他们可以选择完成参数或返回promise。例如,如果initializeCityDatabase ()返回一个在数据库初始化时解析的promise,我们希望返回该promise:

beforeEach ( ( ) = > {
返回 initializeCityDatabase ( ) ;
} ) ;

一次性设置#

在某些情况下,您只需要在文件的开头进行一次安装。当设置是异步的时,这可能特别麻烦,所以您不能内联完成。Jest提供beforeAll毕竟来处理这种情况。

例如,如果两者都initializeCityDatabaseclearCityDatabase返回的承诺,城市数据库可以在测试之间重用,我们可以更改我们的测试代码:

beforeAll ( ( ) = > {
返回 initializeCityDatabase ( ) ;
} ) ;
毕竟 ( ( ) = > {
返回 clearCityDatabase ( ) ;
} ) ;
测试 ( “城市数据库有维也纳” , ( ) = > {
预计 ( isCity ( “维也纳” ) ) toBeTruthy ( ) ;
} ) ;
测试 ( “城市数据库有圣胡安” , ( ) = > {
预计 ( isCity ( “圣胡安” ) ) toBeTruthy ( ) ;
} ) ;

范围#

默认情况下,之前块应用于文件中的每个测试。还可以使用描述块。当它们在a内部时描述块,之前块只应用于其中的测试描述块。

例如,我们不仅有一个城市数据库,还有一个食物数据库。我们可以为不同的测试做不同的设置:

//应用于该文件中的所有测试
beforeEach ( ( ) = > {
返回 initializeCityDatabase ( ) ;
} ) ;
测试 ( “城市数据库有维也纳” , ( ) = > {
预计 ( isCity ( “维也纳” ) ) toBeTruthy ( ) ;
} ) ;
测试 ( “城市数据库有圣胡安” , ( ) = > {
预计 ( isCity ( “圣胡安” ) ) toBeTruthy ( ) ;
} ) ;
描述 ( “城市与食物的匹配” , ( ) = > {
//只适用于描述块中的测试
beforeEach ( ( ) = > {
返回 initializeFoodDatabase ( ) ;
} ) ;
测试 ( “< 3维也纳香肠” , ( ) = > {
预计 ( isValidCityFoodPair ( “维也纳” , “维也纳炸小牛排” ) ) 托比 ( 真正的 ) ;
} ) ;
测试 ( “圣胡安<3个大蕉” , ( ) = > {
预计 ( isValidCityFoodPair ( “圣胡安” , “Mofongo” ) ) 托比 ( 真正的 ) ;
} ) ;
} ) ;

注意,顶级的beforeEachbeforeEach描述块。它可能有助于说亚搏取款明所有钩子的执行顺序。

beforeAll ( ( ) = > 控制台 日志 ( “1 - beforeAll” ) ) ;
毕竟 ( ( ) = > 控制台 日志 ( “1 -毕竟” ) ) ;
beforeEach ( ( ) = > 控制台 日志 ( “1 - beforeEach” ) ) ;
afterEach ( ( ) = > 控制台 日志 ( “1 - afterEach” ) ) ;
测试 ( , ( ) = > 控制台 日志 ( “1 -测试” ) ) ;
描述 ( `作用域/嵌套块` , ( ) = > {
beforeAll ( ( ) = > 控制台 日志 ( “2 - beforeAll” ) ) ;
毕竟 ( ( ) = > 控制台 日志 ( “2 -毕竟” ) ) ;
beforeEach ( ( ) = > 控制台 日志 ( “2 - beforeEach” ) ) ;
afterEach ( ( ) = > 控制台 日志 ( “2 - afterEach” ) ) ;
测试 ( , ( ) = > 控制台 日志 ( “2 -测试” ) ) ;
} ) ;
// 1 - beforeAll
// 1 -在每个之前
// 1 -测试
// 1 - afterEach
// 2 - beforeAll
// 1 -在每个之前
// 2 -在每个之前
// 2 -测试
// 2 - afterEach
// 1 - afterEach
// 2 -毕竟
// 1 -毕竟

描述块和测试块的执行顺序#

Jest执行测试文件中的所有描述处理程序之前它执行任何实际的测试。这是在内部进行设置和拆卸的另一个原因*之前后*处理程序,而不是在描述块中。一旦描述块完成,默认情况下Jest将按收集阶段遇到的顺序串行运行所有测试,等待每个测试完成并进行整理,然后继续。

考虑以下说明性的测试文件和输出:

描述 ( “外” , ( ) = > {
控制台 日志 ( “描述outer-a” ) ;
描述 ( “描述内部1” , ( ) = > {
控制台 日志 ( “描述内部1” ) ;
测试 ( “测试1” , ( ) = > {
控制台 日志 ( “描述内心的测试” ) ;
预计 ( 真正的 ) toEqual ( 真正的 ) ;
} ) ;
} ) ;
控制台 日志 ( “描述outer-b” ) ;
测试 ( “测试1” , ( ) = > {
控制台 日志 ( "外部描述测试" ) ;
预计 ( 真正的 ) toEqual ( 真正的 ) ;
} ) ;
描述 ( 《描述内部2》 , ( ) = > {
控制台 日志 ( 《描述内部2》 ) ;
测试 ( “描述内心的测试2” , ( ) = > {
控制台 日志 ( “描述内心的测试2” ) ;
预计 ( ) toEqual ( ) ;
} ) ;
} ) ;
控制台 日志 ( “描述outer-c” ) ;
} ) ;
/ /描述outer-a
//描述内心世界
/ /描述outer-b
//描述内部
/ /描述outer-c
//测试描述内部1
//测试描述外部
//测试描述内部2

一般建议#

如果测试失败,首先要检查的事情之一应该是,当测试是唯一运行的测试时,测试是否失败。要使用Jest只运行一个测试,请暂时更改它测试命令test.only:

测试 只有 ( “这将是唯一运行的测试” , ( ) = > {
预计 ( 真正的 ) 托比 ( ) ;
} ) ;
测试 ( “此测试将无法运行” , ( ) = > {
预计 ( “一个” ) 托比 ( “一个” ) ;
} ) ;

如果您有一个测试,当它作为一个更大的套件的一部分运行时经常失败,而当您单独运行它时却不会失败,那么很有可能来自不同测试的某些东西干扰了这个测试。您通常可以通过清除某些共享状态来解决这个问题beforeEach。如果您不确定是否正在修改某些共享状态,您还可以尝试abeforeEach日志数据。

最后一次更新在通过Sebastien Lorber