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

非同期の事例

まず,开始ガイドに纏められているようにJestで巴贝尔のサポートを有効にします。

APIからユーザのデータを取得してユーザ名を返すモジュールを実装してみましょう。

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

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

ここでネットワーク経由でユーザのデータを取得するrequest.jsの実装を想像してみましょう。

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

テストではネットワークへの接続は行いたくないので,request.jsモジュールのマニュアルモックを__mocks__フォルダに作成することにします(このフォルダ名は小文字の必要があり,__MOCKS__では動作しません)。こんな感じのものでしょうか:

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

次に非同期機能のテストを書いてみましょう。

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

マニュアルモックを使用するようにjest.mock(“. . /请求”)を呼び出します。は戻り値が解決されようとしている承诺であることを期待します。最後に承诺を返す限り,任意の数だけ承诺をチェーンして任意のタイミングで预计を呼び出すことができます。

.resolves#

解决了を使用することで,他のいかなるマッチャと共に成功した承诺の値を取り出すための記述量を減らすことができます。承诺が拒绝された場合はアサーションは失敗します。

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

异步/等待#

异步/等待シンタックスを使用したテストも可能です。以下に前述した例と同じものを异步/等待でどのように書くかを示します:

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

プロジェクトで异步/等待を有効にするには,@babel-preset-envをインストールし,babel.config.jsファイルで機能を有効化します。

エラー処理#

エラーは.catchメソッドで処理することができます。想定した数のアサーションが呼ばれたことを確認するため,expect.assertionsを必ず追加して下さい。さもなければ承诺が拒绝されなかった場合にテストが失敗したと判定されません:

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

.rejects#

.rejects亚搏取款助手的工作方式是.resolves亚搏取款帮手。承诺が成功した場合は,テストは自動的に失敗します。expect.assertions(数量)は必須ではありませんが,テスト中に想定した数のアサーションが呼び出されることを確認することために,追加することをお勧めします。これを利用する理由としては,.resolvesの結果を返回/等待することを忘れてしまうことが良くあるからです。

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

このコード例は例子/异步から利用可能です。

setTimeoutのようなタイマーをテストしたい場合は,定时器模拟ドキュメントを読んで下さい。