Chai アサーションを使用した HTTP 統合テスト。
expect
should
これは Chai Assertion Library のアドオン プラグインです。 npm経由でインストールします。
npm install chai-http
他のすべての Chai プラグインと同様に、このプラグインを使用します。
import * as chai from "chai" ;
import chaiHttp from "chai-http" ;
chai . use ( chaiHttp ) ;
// if you need to access `request`
import { default as chaiHttp , request } from "chai-http" ;
chai . use ( chaiHttp ) ;
request . get ( ... ) . send ( ... ) ;
// or setting up an app
request . execute ( app ) ;
Web ページで Chai HTTP を使用するには、現時点では最新の v4 バージョンを使用してください。
Chai HTTP は、スーパーエージェントを介したライブ統合テスト用のインターフェイスを提供します。これを行うには、まずアプリケーションまたは URL へのリクエストを作成する必要があります。
構築時に、呼び出す http VERB リクエスト (get、post など) を指定できるチェーン可能な API が提供されます。
リクエストの基盤として関数 (Express アプリや Connect アプリなど) または Node.js http(s) サーバーを使用できます。サーバーが実行されていない場合、chai-http は特定のテストをリッスンする適切なポートを見つけます。
注:この機能は Node.js でのみサポートされており、Web ブラウザーではサポートされていません。
import { request } from 'chai-http' ;
request . execute ( app )
. get ( '/' )
app
request.execute()
に渡すと、( listen()
) を呼び出すことによって) 受信リクエストに対してサーバーが自動的に開き、リクエストが行われると ( .close()
を呼び出すことによって) サーバーが自動的にシャットダウンします。サーバーを開いたままにしたい場合、おそらく複数のリクエストを行っている場合は、 .request()
の後に.keepOpen()
を呼び出し、サーバーを手動で閉じる必要があります。
import { request } from 'chai-http' ;
const requester = request . Request ( app ) . keepOpen ( )
Promise . all ( [
requester . get ( '/a' ) ,
requester . get ( '/b' ) ,
] )
. then ( responses => { /* ... */ } )
. then ( ( ) => requester . close ( ) )
リクエストの基礎としてベース URL を使用することもできます。
import { request } from 'chai-http' ;
request . execute ( 'http://localhost:8080' )
. get ( '/' )
特定の VERB (get、post など) を使用してリクエストが作成されたら、次の追加メソッドを連鎖してリクエストを作成します。
方法 | 目的 |
---|---|
.set(key, value) | リクエストヘッダーを設定する |
.send(data) | リクエストデータの設定(デフォルトのタイプはJSON) |
.type(dataType) | .send() メソッドから送信されるデータのタイプ (xml、フォームなど) を変更します。 |
.attach(field, file, attachment) | ファイルを添付する |
.auth(username, password) | 基本認証用の認証ヘッダーを追加する |
.query(parmasObject) | 一部の GET パラメータのチェーン |
例:
.set()
import { request } from 'chai-http' ;
// Set a request header
request . execute ( app )
. put ( '/user/me' )
. set ( 'Content-Type' , 'application/json' )
. send ( { password : '123' , confirmPassword : '123' } )
.send()
import { request } from 'chai-http' ;
// Send some JSON
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
.type()
import { request } from 'chai-http' ;
// Send some Form Data
request . execute ( app )
. post ( '/user/me' )
. type ( 'form' )
. send ( {
'_method' : 'put' ,
'password' : '123' ,
'confirmPassword' : '123'
} )
.attach()
import { request } from 'chai-http' ;
// Attach a file
request . execute ( app )
. post ( '/user/avatar' )
. attach ( 'imageField' , fs . readFileSync ( 'avatar.png' ) , 'avatar.png' )
.auth()
import { request } from 'chai-http' ;
// Authenticate with Basic authentication
request . execute ( app )
. get ( '/protected' )
. auth ( 'user' , 'pass' )
// Authenticate with Bearer Token
request . execute ( app )
. get ( '/protected' )
. auth ( accessToken , { type : 'bearer' } )
.query()
import { request } from 'chai-http' ;
// Chain some GET query parameters
request . execute ( app )
. get ( '/search' )
. query ( { name : 'foo' , limit : 10 } ) // /search?name=foo&limit=10
次の例では、Chai の Expect アサーション ライブラリを使用します。
const { expect } = chai ;
リクエストを作成し、そのレスポンスでアサートするには、 end
メソッドを使用できます。
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. end ( ( err , res ) => {
expect ( err ) . to . be . null ;
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
end
関数にはコールバックが渡されるため、アサーションは非同期で実行されます。したがって、コールバックが完了したことをテスト フレームワークに通知するメカニズムを使用する必要があります。それ以外の場合、アサーションがチェックされる前にテストに合格します。
たとえば、Mocha テスト フレームワークでは、これは、コールバックが完了したことを通知するdone
コールバックを使用して実現され、アサーションを検証できます。
import { request } from 'chai-http' ;
it ( 'fails, as expected' , function ( done ) { // <= Pass in done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ;
done ( ) ; // <= Call done to signal callback end
} ) ;
} ) ;
it ( 'succeeds silently!' , ( ) => { // <= No done callback
request . execute ( 'http://localhost:8080' )
. get ( '/' )
. end ( ( err , res ) => {
expect ( res ) . to . have . status ( 123 ) ; // <= Test completes before this runs
} ) ;
} ) ;
done
が渡されると、Mocha はdone()
が呼び出されるまで、またはタイムアウトが期限切れになるまで待機します。また、 done
完了を通知するときにエラー パラメータを受け入れます。
Promise
が利用可能な場合、 request
Promise 対応ライブラリになり、 then
連鎖が可能になります。
import { request } from 'chai-http' ;
request . execute ( app )
. put ( '/user/me' )
. send ( { password : '123' , confirmPassword : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} )
. catch ( ( err ) => {
throw err ;
} ) ;
場合によっては、あるリクエストの Cookie を保持し、次のリクエストで Cookie を送信する必要があることがあります (たとえば、最初のリクエストでログインし、後で認証専用リソースにアクセスする場合)。このために、 .request.agent()
が利用可能です。
import { request } from 'chai-http' ;
// Log in
const agent = request . agent ( app )
agent
. post ( '/session' )
. send ( { username : 'me' , password : '123' } )
. then ( ( res ) => {
expect ( res ) . to . have . cookie ( 'sessionid' ) ;
// The `agent` now has the sessionid cookie saved, and will send it
// back to the server in the next request:
return agent . get ( '/user/me' )
. then ( ( res ) => {
expect ( res ) . to . have . status ( 200 ) ;
} ) ;
} ) ;
注: request.agent(app)
によって開始されたサーバーは、テスト後に自動的に終了しません。テスト後にagent.close()
を呼び出して、プログラムが確実に終了するようにする必要があります。
Chai HTTP モジュールは、 expect
およびshould
インターフェイス用の多数のアサーションを提供します。
応答に指定されたステータスがあることをアサートします。
expect ( res ) . to . have . status ( 200 ) ;
Response
またはRequest
オブジェクトにヘッダーがあることをアサートします。値が指定された場合、値との等しいことがアサートされます。正規表現を渡してチェックすることもできます。
注: Web ブラウザで実行する場合、同一生成元ポリシーは Chai HTTP に特定のヘッダーの読み取りのみを許可するため、アサーションが失敗する可能性があります。
expect ( req ) . to . have . header ( 'x-api-key' ) ;
expect ( req ) . to . have . header ( 'content-type' , 'text/plain' ) ;
expect ( req ) . to . have . header ( 'content-type' , / ^text / ) ;
Response
またはRequest
オブジェクトにヘッダーがあることをアサートします。
注: Web ブラウザで実行する場合、同一生成元ポリシーは Chai HTTP に特定のヘッダーの読み取りのみを許可するため、アサーションが失敗する可能性があります。
expect ( req ) . to . have . headers ;
文字列が有効な IP アドレスを表すことをアサートします。
expect ( '127.0.0.1' ) . to . be . an . ip ;
expect ( '2001:0db8:85a3:0000:0000:8a2e:0370:7334' ) . to . be . an . ip ;
Response
またはRequest
オブジェクトが指定されたコンテンツ タイプを持つことをアサートします。
expect ( req ) . to . be . json ;
expect ( req ) . to . be . html ;
expect ( req ) . to . be . text ;
Response
またはRequest
オブジェクトに指定された文字セットがあることをアサートします。
expect ( req ) . to . have . charset ( 'utf-8' ) ;
Response
オブジェクトにリダイレクト ステータス コードがあることをアサートします。
expect ( res ) . to . redirect ;
expect ( res ) . to . not . redirect ;
Response
オブジェクトが指定された場所にリダイレクトされることをアサートします。
expect ( res ) . to . redirectTo ( 'http://example.com' ) ;
expect ( res ) . to . redirectTo ( / ^/search/results?orderBy=desc$ / ) ;
Request
オブジェクトに、指定されたキー (オプションで) 値と等しいクエリ文字列パラメーターがあることをアサートします。
expect ( req ) . to . have . param ( 'orderby' ) ;
expect ( req ) . to . have . param ( 'orderby' , 'date' ) ;
expect ( req ) . to . not . have . param ( 'limit' ) ;
Request
またはResponse
オブジェクトに、指定されたキー (オプションで) 値と等しい Cookie ヘッダーがあることをアサートします。
expect ( req ) . to . have . cookie ( 'session_id' ) ;
expect ( req ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( req ) . to . not . have . cookie ( 'PHPSESSID' ) ;
expect ( res ) . to . have . cookie ( 'session_id' ) ;
expect ( res ) . to . have . cookie ( 'session_id' , '1234' ) ;
expect ( res ) . to . not . have . cookie ( 'PHPSESSID' ) ;
chai-http
、プラグインを使用したsemantic-release
でリリースされます。
commit-analyzer
コミット メッセージから次のバージョンを決定します。release-notes-generator
changelog
使用して CHANGELOG.md ファイルを更新します。github
使用して GitHub リリースを公開します。git
使用してリリースアセットをコミットします。npm
を使用します。 (MITライセンス)
著作権 (c) ジェイク・ルアー [email protected]
本ソフトウェアおよび関連ドキュメント ファイル (以下「ソフトウェア」) のコピーを入手した人には、使用、コピー、変更、マージする権利を含むがこれらに限定されない、制限なくソフトウェアを取り扱う許可が、ここに無償で与えられます。 、以下の条件を条件として、本ソフトウェアのコピーを出版、配布、サブライセンス、および/または販売すること、および本ソフトウェアが提供される人物にそれを許可すること。
上記の著作権表示およびこの許可通知は、ソフトウェアのすべてのコピーまたは主要部分に含まれるものとします。
ソフトウェアは「現状のまま」提供され、明示的か黙示的かを問わず、商品性、特定目的への適合性、および非侵害の保証を含むがこれらに限定されない、いかなる種類の保証も行われません。いかなる場合においても、作者または著作権所有者は、契約行為、不法行為、またはその他の行為であるかどうかにかかわらず、ソフトウェアまたはソフトウェアの使用またはその他の取引に起因または関連して生じる、いかなる請求、損害、またはその他の責任に対しても責任を負わないものとします。ソフトウェア。