JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

Node.jsのassert.rejects()関数とは?構文・パラメータ・実行例をわかりやすく解説

Node.js の assert モジュールには、関数のアサーション(値や動作の検証)に役立つさまざまな機能が用意されています。中でも assert.rejects() 関数は、渡された非同期関数「asyncfn」が返す Promise が拒否(reject)されることを検証するためのメソッドです。

asyncfn が関数の場合、この関数は即座に呼び出され、その戻り値である Promise が完了するのを待ちます。その後、Promise が正しく reject されたかどうかをチェックします。非同期処理におけるエラーハンドリングのテストに非常に便利な機能です。

構文

assert.rejects(asyncfn, [error], [message])

パラメータ

各パラメータの詳細は以下の通りです。

  • asyncfn(value) – 検証対象となる非同期関数です。同期的にエラーをスローする場合もあります。

  • error – 省略可能なパラメータです。クラス、正規表現、検証用の関数、あるいは各プロパティがテスト対象となるオブジェクトを指定できます。

  • message – 省略可能なパラメータです。関数の実行時に表示される、ユーザー定義のメッセージを指定します。

assertモジュールのインストール

npm install assert

assert モジュールは Node.js に標準で組み込まれているため、この手順は省略しても構いません。以下のコマンドを実行すれば、利用可能な assert モジュールの最新バージョンを確認できます。

npm version assert

モジュールのインポート方法

const assert = require("assert").strict;

使用例1:アサーションエラーが発生するケース

まず「assertRejects.js」という名前のファイルを作成し、以下のコードを貼り付けてください。作成後、次のコマンドでコードを実行します。

node assertRejects.js

assertRejects.js

// モジュールのインポート
const assert = require('assert').strict;

(async () => {
  // 21 と 20 は一致しないため、この時点でエラーが発生する
  assert.strictEqual(21, 20)
  await assert.rejects(
    async () => {
      throw new TypeError('Value passed is Incorrect !');
    },
    (err) => {
      assert.strictEqual(err.name, 'TypeError');
      assert.strictEqual(err.message, 'Incorrect value');
      return true;
    }
  ).then(() => {
    console.log("This is a reject demo")
  });
})();

出力結果

C:\home\node>> node assertRejects.js
(node:259525) UnhandledPromiseRejectionWarning: AssertionError
[ERR_ASSERTION]: Input A expected to strictly equal input B:
+ expected - actual
- 21
+ 20
    at /home/node/test/assert.js:5:9
    at Object. (/home/node/test/assert.js:18:3)
    at Module._compile (internal/modules/cjs/loader.js:778:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:789:10)
    at Module.load (internal/modules/cjs/loader.js:653:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:593:12)
    at Function.Module._load (internal/modules/cjs/loader.js:585:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:831:12)
    at startup (internal/bootstrap/node.js:283:19)
    at bootstrapNodeJSCore (internal/bootstrap/node.js:623:3)
(node:259525) UnhandledPromiseRejectionWarning: Unhandled promise rejection.
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:259525) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

この例では、assert.strictEqual(21, 20) の時点で値が一致していないため AssertionError がスローされます。その結果、catch ブロックなどでハンドリングされていない Promise の拒否として警告(UnhandledPromiseRejectionWarning)が出力されています。

使用例2:正常に検証が完了するケース

続いて、もう一つの例を見てみましょう。

// モジュールのインポート
const assert = require('assert').strict;

(async () => {
  // 21 と 21 は一致するため、エラーは発生しない
  assert.strictEqual(21, 21)
  await assert.rejects(
    async () => {
      throw new TypeError('Value passed is Incorrect !');
    },
    (err) => {
      assert.strictEqual(err.name, 'TypeError');
      assert.strictEqual(err.message, 'Value passed is Incorrect !');
      return true;
    }
  ).then(() => {
    console.log("This is a reject demo success")
  });
})();

出力結果

C:\home\node>> node assertRejects.js
This is a reject demo success

この例では、assert.strictEqual(21, 21) が成功し、さらに assert.rejects() による検証(エラー名が TypeError であること、エラーメッセージが一致していること)もすべてパスします。そのため、コンソールには「This is a reject demo success」が出力され、処理が正常に完了します。

このように assert.rejects() を活用すれば、非同期処理が期待どおりにエラーを投げるかどうかを簡潔にテストできます。API クライアントやデータベースアクセスなど、例外が発生しうる非同期コードの堅牢性を高めたい場面で、ぜひ使ってみてください。


  1. JavaScriptの関数プロトタイプとは?仕組みと使い方を解説

    JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに

  2. JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説

    JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン