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

异步示例

首先, 像开始里面所说的那样,启用巴贝尔的支持

让我们实现一个模块,它从API获取用户数据并返回用户名。

/ / user.js
进口 请求 “/请求。” ;
出口 函数 getUserName ( 用户标识 ) {
返回 请求 ( ' /用户/ ' + 用户标识 ) 然后 ( 用户 = > 用户 的名字 ) ;
}

在上面的实现中,我们期望request.js模块返回一个承诺。我们把电话连接到然后接收用户名。我们把电话连接到然后接收用户名。

现在想象一个实现request.js它会到网络上获取一些用户数据:

/ / request.js
常量 http = 需要 ( “http” ) ;
出口 默认的 函数 请求 ( url ) {
返回 承诺 ( 解决 = > {
/ /这是一个HTTP请求的例子,用来从API获取用户信息
//该模块正在__mocks__/request.js中被模拟
http 得到 ( { 路径 : url } , 响应 = > {
数据 = ;
响应 ( “数据” , _data = > ( 数据 + = _data ) ) ;
响应 ( “结束” , ( ) = > 解决 ( 数据 ) ) ;
} ) ;
} ) ;
}
//该模块正在__mocks__/request.js中被模拟
http 得到 ( { 路径 : url } , 响应 = > {
数据 = ;
响应 ( “数据” , _data = > ( 数据 + = _data ) ) ;
响应 ( “结束” , ( ) = > 解决 ( 数据 ) ) ;
} ) ;
} ) ;
}

因为我们不想在测试中进入网络,所以我们将为我们的request.js模块的__mocks__文件夹(该文件夹区分大小写,__MOCKS__不会工作)。就像是这样: 就像是这样:

/ / __mocks__ / request.js
常量 用户 = {
4 : { 的名字 : “马克” } ,
5 : { 的名字 : “保罗” } ,
} ;
出口 默认的 函数 请求 ( url ) {
返回 承诺 ( ( 解决 , 拒绝 ) = > {
常量 用户标识 = 方法用于 ( url 字符串的子串 ( ' /用户/ ' 长度 ) , 10 ) ;
过程 nextTick ( ( ) = >
用户 ( 用户标识 ]
吗? 解决 ( 用户 ( 用户标识 ] )
: 拒绝 ( {
错误 : “用户” + 用户标识 + “没有找到”。 ,
} ) ,
) ;
} ) ;
} 解决 ( 用户 ( 用户标识 ] )
: 拒绝 ( {
错误 : “用户” + 用户标识 + “没有找到”。 ,
} ) ,
) ;
} ) ;
}

现在我们就来编写我们的异步函数的测试

/ / __tests__ / user-test.js
开玩笑 模拟 ( “. . /请求” ) ;
进口 * 作为 用户 “. . /用户” ;
/ /断言必须返回一个primose
( “与承诺” , ( ) = > {
预计 断言 ( 1 ) ;
返回 用户 getUserName ( 4 ) 然后 ( 数据 = > 预计 ( 数据 ) toEqual ( “马克” ) ) ;
} ) ;
( “与承诺” , ( ) = > {
预计 断言 ( 1 ) ;
返回 用户 getUserName ( 4 ) 然后 ( 数据 = > 预计 ( 数据 ) toEqual ( “马克” ) ) ;
} ) ;

我们调用jest.mock (' . ./请求”)告诉开玩笑使用我们手动的创建的模拟数据。通过解决了能更加简单地解析一个完成态的承诺的返回值。如果承诺是拒绝态的话,断言将会返回失败。断言的是将会返回一个承诺对象。你可以随心所欲地做出承诺,然后打电话预计任何时候,只要你在最后返回一个承诺。

.resolves#

有一种更简洁的使用方法解决了将已实现的promise的值与任何其他匹配器一起展开。如果承诺被拒绝,断言将失败。

( “与解析” , ( ) = > {
预计 断言 ( 1 ) ;
返回 预计 ( 用户 getUserName ( 5 ) ) 解决了 toEqual ( “保罗” ) ;
} ) ;

异步/等待#

使用异步/等待语法也是可能的。下面是你如何写和以前一样的例子:

/ /使用异步/等待
/ /使用异步/等待
( “与异步/等待” , 异步 ( ) = > {
预计 断言 ( 1 ) ;
常量 数据 = 等待 用户 getUserName ( 4 ) ;
预计 ( 数据 ) toEqual ( “马克” ) ;
} ) ;
/ /异步/等待也可以和”。解决“一起使用。
( '与async/await和resolved一起工作' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
等待 预计 ( 用户 getUserName ( 5 ) ) 解决了 toEqual ( “保罗” ) ;
} ) ;
( '与async/await和resolved一起工作' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
等待 预计 ( 用户 getUserName ( 5 ) ) 解决了 toEqual ( “保罗” ) ;
} ) ;

要在项目中启用async/await,请安装@babel / preset-env并在你的babel.config.js文件。

错误处理#

可以使用.catch方法处理错误。请确保添加expect.assertions来验证一定数量的断言被调用。否则一个完成态的承诺不会让测试失败︰

/ /用承诺。抓测试一个异步的错误
/ /用承诺。抓测试一个异步的错误
( “带有承诺的测试错误” , ( ) = > {
预计 断言 ( 1 ) ;
返回 用户 getUserName ( 2 ) ( e = >
预计 ( e ) toEqual ( {
错误 : '用户2未找到。' ,
} ) ,
) ;
} ) ;
//或使用async/await。
( '带有异步/await的测试错误' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
试一试 {
等待 用户 getUserName ( 1 ) ;
} ( e ) {
预计 ( e ) toEqual ( {
错误 : '用户1未找到' ,
} ) ;
}
} ) ;
( '带有异步/await的测试错误' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
试一试 {
等待 用户 getUserName ( 1 ) ;
} ( e ) {
预计 ( e ) toEqual ( {
错误 : '用户1未找到' ,
} ) ;
}
} ) ;

.rejects#

.rejects亚搏取款助手的工作方式是.resolves亚搏取款帮手。如果承诺被拒绝,则测试将自动失败。如果承诺被拒绝,则测试将自动失败。expect.assertions(数量)是否需要但建议验证一定数量断言在测试过程中调用。否则,我们很容易忘记忘记返回/等待.resolves断言。

/ /用“.rejects”。来测试一个异步的错误
/ /用“.rejects”。来测试一个异步的错误
( “带有拒绝的测试错误” , ( ) = > {
预计 断言 ( 1 ) ;
返回 预计 ( 用户 getUserName ( 3. ) ) 拒绝 toEqual ( {
错误 : '用户3未找到' ,
} ) ;
} ) ;
/ /或者与异步/等待一起使用“.rejects”。
( '使用异步/await测试错误并拒绝' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
等待 预计 ( 用户 getUserName ( 3. ) ) 拒绝 toEqual ( {
错误 : '用户3未找到' ,
} ) ;
} ) ;
( '使用异步/await测试错误并拒绝' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
等待 预计 ( 用户 getUserName ( 3. ) ) 拒绝 toEqual ( {
错误 : '用户3未找到' ,
} ) ;
} ) ;

这个例子的代码可以在下面找到例子/异步

如果你想测试计时器,比如setTimeout看一看定时器模拟文档。