跳转到主要内容
版本:下一个

嗯,异步的范例

首先,我想说的是,这些笑话都不符合我的要求Introducao

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

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

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

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

/ / request.js
常量 http = 需要 ( “http” ) ;
出口 默认的 函数 请求 ( url ) {
返回 承诺 ( 解决 = > {
// Isto é um exemplo de uma requisição http, por exemplo para buscar
// dados de usuário de uma API。
// Este modulo está sendo simulado em __mocks__/request.js
http 得到 ( { 路径 : url } , 响应 = > {
数据 = ;
响应 ( “数据” , _data = > ( 数据 + = _data ) ) ;
响应 ( “结束” , ( ) = > 解决 ( 数据 ) ) ;
} ) ;
} ) ;
}

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

/ / __tests__ / user-test.js
开玩笑 模拟 ( “. . /请求” ) ;
进口 * 作为 用户 “. . /用户” ;
// A afirmação para promessa deve ser retornada。它('funciona com promessas', () => {
预计 断言 ( 1 ) ;
返回 用户 getUserName ( 4 ) 然后 ( 数据 = > 预计 ( 数据 ) toEqual ( “马克” ) ) ;
} ) ;

我有一种不同步的功能。

/ / __mocks__ / request.js
常量 用户 = {
4 : { 的名字 : “马克” } ,
5 : { 的名字 : “保罗” } ,
} ;
出口 默认的 函数 请求 ( url ) {
返回 承诺 ( ( 解决 , 拒绝 ) = > {
常量 用户标识 = 方法用于 ( url 字符串的子串 ( ' /用户/ ' 长度 ) , 10 ) ;
过程 nextTick ( ( ) = >
用户 ( 用户标识 ]
吗? 解决 ( 用户 ( 用户标识 ] )
: 拒绝 ( {
错误 :
( “funciona com promessa口惠而实不至” , ( ) = > {
预计 断言 ( 1 ) ;
返回 用户 getUserName ( 4 ) 然后 ( 数据 = > 预计 ( 数据 ) toEqual ( “马克” ) ) ;
} ) ;

号chamamosjest.mock(“. . /请求”)para informar Jest para usar nossa simulação手册。我要把我的头发剪掉。你可以随心所欲地做出承诺,然后打电话预计任何时候,只要你在最后返回一个承诺。

.resolves#

存在uma maneira menos verbosa usando解决了我向你解释了我的勇气,我要和你一起离开。请给rejeitada写个便条,afirmação falhará。

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

异步/等待#

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

//异步/await pode ser usado
( “funciona com async /等待” , 异步 ( ) = > {
预计 断言 ( 1 ) ;
常量 数据 = 等待 用户 getUserName ( 4 ) ;
预计 ( 数据 ) toEqual ( “马克” ) ;
} ) ;
// async/await também pode ser usado com ' .resolve '。
( 'funciona com async/await e resolve ' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
等待 预计 ( 用户 getUserName ( 5 ) ) 解决了 toEqual ( “保罗” ) ;
} ) ;

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

Tratamento de论述#

错误之处是在método.catch。Se证书de字典expect.assertions请您核对一下número afirmações são查玛达斯。Caso contrário, uma promessa cumprida não falharia no teste:

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

.rejects#

.rejects亚搏取款助手的工作方式是.resolves亚搏取款帮手。祝你好运é cumprida, o teste automaticamente irá falhar。expect.assertions(数量)是否需要但建议验证一定数量断言在测试过程中调用。否则,我们很容易忘记忘记返回/等待.resolves断言。

// Testando para errors async usando ' .rejects '。
( “testa erro com拒绝” , ( ) = > {
预计 断言 ( 1 ) ;
返回 预计 ( 用户 getUserName ( 3. ) ) 拒绝 toEqual ( {
错误 : '用户3未找到' ,
} ) ;
} ) ;
// Ou usando async/await com ' .rejects '。
( 'testa error com async/await e rejected ' , 异步 ( ) = > {
预计 断言 ( 1 ) ;
等待 预计 ( 用户 getUserName ( 3. ) ) 拒绝 toEqual ( {
错误 : '用户3未找到' ,
} ) ;
} ) ;

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

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