
Express、Next.jsおよびKOAルーティング関数をテストするためのMock 'http'オブジェクトですが、 requestとresponseオブジェクトのモックアップを必要とするコードを持つnode.js Webサーバーアプリケーションのテストに使用できます。
このプロジェクトは、NPMパッケージとして入手できます。
$ npm install node-mocks-http --save-dev
$ npm install @types/node @types/express --save-dev # when using TypeScriptまたは
$ yarn add node-mocks-http --dev
$ yarn add @types/node @types/express --dev # when using TypeScriptパッケージをインストールした後、テストファイルに以下を含めます。
const httpMocks = require ( 'node-mocks-http' ) ; 次のエクスプレスルートがあるとします。
app . get ( '/user/:id' , routeHandler ) ;そして、あなたはそのルートの呼び出しを処理するための関数を作成しました:
const routeHandler = function ( request , response ) { ... } ;選択したテストフレームワークを使用して、このようないくつかのコードでrouteHandler機能を簡単にテストできます。
exports [ 'routeHandler - Simple testing' ] = function ( test ) {
const request = httpMocks . createRequest ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const response = httpMocks . createResponse ( ) ;
routeHandler ( request , response ) ;
const data = response . _getJSONData ( ) ; // short-hand for JSON.parse( response._getData() );
test . equal ( 'Bob Dog' , data . name ) ;
test . equal ( 42 , data . age ) ;
test . equal ( '[email protected]' , data . email ) ;
test . equal ( 200 , response . statusCode ) ;
test . ok ( response . _isEndCalled ( ) ) ;
test . ok ( response . _isJSON ( ) ) ;
test . ok ( response . _isUTF8 ( ) ) ;
test . done ( ) ;
} ;タイプスクリプトのタイピングは、このプロジェクトにバンドルされています。特に、 .createRequest() 、. .createResponse() 、および.createMocks()メソッドが入力され、汎用です。明示的に指定されていない限り、それらはエクスプレスベースのリクエスト/応答オブジェクトを返します。
it ( 'should handle expressjs requests' , ( ) => {
const mockExpressRequest = httpMocks . createRequest ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const mockExpressResponse = httpMocks . createResponse ( ) ;
routeHandler ( request , response ) ;
const data = response . _getJSONData ( ) ;
test . equal ( 'Bob Dog' , data . name ) ;
test . equal ( 42 , data . age ) ;
test . equal ( '[email protected]' , data . email ) ;
test . equal ( 200 , response . statusCode ) ;
test . ok ( response . _isEndCalled ( ) ) ;
test . ok ( response . _isJSON ( ) ) ;
test . ok ( response . _isUTF8 ( ) ) ;
test . done ( ) ;
} ) ; MOCK要求と応答の予想されるタイプパラメーターは、nodejs http.IncomingRequestインターフェイスまたはFetch API Requestクラスを拡張する任意のタイプを期待します。これは、他のフレームワークからのリクエストをmockすることもできることを意味します。 NextJSリクエストの例は次のようになります。
it ( 'should handle nextjs requests' , ( ) => {
const mockExpressRequest = httpMocks . createRequest < NextApiRequest > ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const mockExpressResponse = httpMocks . createResponse < NextApiResponse > ( ) ;
// ... the rest of the test as above.
} ) ;また、NextJSの新しいAppRouterからのリクエストを模倣することも可能です。
it ( 'should handle nextjs app reouter requests' , ( ) => {
const mockExpressRequest = httpMocks . createRequest < NextRequest > ( {
method : 'GET' ,
url : '/user/42' ,
params : {
id : 42
}
} ) ;
const mockExpressResponse = httpMocks . createResponse < NextResponse > ( ) ;
// ... the rest of the test as above.
} ) ; httpMocks.createRequest(options)
オプションは、次の値のいずれかを持つオブジェクトハッシュです。
| オプション | 説明 | デフォルト値 |
|---|---|---|
method | HTTPメソッドをリクエストします | '得る' |
url | urlをリクエストします | '' |
originalUrl | 元のURLをリクエストします | url |
baseUrl | ベースURLをリクエストします | url |
path | リクエストパス | '' |
params | パラメージを含むオブジェクトハッシュ | {} |
session | セッション値を持つオブジェクトハッシュ | undefined |
cookies | リクエストクッキー付きのオブジェクトハッシュ | {} |
socket | リクエストソケットを使用したオブジェクトハッシュ | {} |
signedCookies | 署名されたクッキー付きのオブジェクトハッシュ | undefined |
headers | リクエストヘッダー付きのオブジェクトハッシュ | {} |
body | ボディとオブジェクトハッシュ | {} |
query | クエリ値を持つオブジェクトハッシュ | {} |
files | 値を持つオブジェクトハッシュ | {} |
この関数から返されるオブジェクトは、Express Request関数( .accepts() 、. .is() 、. .get() 、. .range() )などをサポートします。不足している機能については、PRを送信してください。
httpMocks . createResponse ( options ) ;オプションは、次の値のいずれかを持つオブジェクトハッシュです。
| オプション | 説明 | デフォルト値 |
|---|---|---|
locals | responseローカル変数を含むオブジェクト | {} |
eventEmitter | responseオブジェクトで使用されるイベントエミッター | mockEventEmitter |
writableStream | responseオブジェクトで使用される書き込みストリーム | mockWritableStream |
req | 応答するオブジェクトを要求します | ヌル |
注:
node-mocks-httpに含まれるすぐに使用できるモックイベントエミッターは、機能的なイベントエミッターではなく、実際にはイベントを発しません。イベントハンドラーをテストしたい場合は、独自のイベントエミッタを持参する必要があります。
これが例です:
const httpMocks = require ( 'node-mocks-http' ) ;
const res = httpMocks . createResponse ( {
eventEmitter : require ( 'events' ) . EventEmitter
} ) ;
// ...
it ( 'should do something' , function ( done ) {
res . on ( 'end' , function ( ) {
assert . equal ( ... ) ;
done ( ) ;
} ) ;
} ) ;
// ...これは、リクエスト本体を送信し、「データ」と「終了」イベントをトリガーする例です。
const httpMocks = require ( 'node-mocks-http' ) ;
const req = httpMocks . createRequest ( ) ;
const res = httpMocks . createResponse ( {
eventEmitter : require ( 'events' ) . EventEmitter
} ) ;
// ...
it ( 'should do something' , function ( done ) {
res . on ( 'end' , function ( ) {
expect ( response . _getData ( ) ) . to . equal ( 'data sent in request' ) ;
done ( ) ;
} ) ;
route ( req , res ) ;
req . send ( 'data sent in request' ) ;
} ) ;
function route ( req , res ) {
let data = [ ] ;
req . on ( 'data' , ( chunk ) => {
data . push ( chunk ) ;
} ) ;
req . on ( 'end' , ( ) => {
data = Buffer . concat ( data ) ;
res . write ( data ) ;
res . end ( ) ;
} ) ;
}
// ... httpMocks . createMocks ( reqOptions , resOptions ) ; createRequestとcreateResponseマージします。各コンストラクターに与えられたオプションオブジェクトを渡します。プロパティreqとresを持つオブジェクトを返します。
大きなフレームワークのないシンプルな模擬が欲しかった。
また、モックがモックされている元のフレームワークのように振る舞うことを望んでいましたが、呼び出し後に値を呼び出して検査する前に値を設定することを可能にしました。
HTTPモジュールからより多くのオブジェクトを作成するなど、このプロジェクトに価値をもたらすためのより多くのボランティアを探しています。
このプロジェクトは、ock笑する必要があるすべての機能に対処するわけではありませんが、それは良いスタートです。 Pullリクエストを自由に送信してください。チームのメンバーは、それらを合併するのにタイムリーになります。
貢献したい場合は、貢献ガイドラインをお読みください。
ほとんどのリリースでは、モックでバグを修正するか、node.jsが提供し、Expressによって拡張された実際のRequestとResponseオブジェクトと同様の機能を追加します。
詳細については、リリース履歴を参照してください。
MITの下でライセンスされています。