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

Node.jsのassert.doesNotThrow()関数の使い方と実行例をわかりやすく解説

assertモジュールは、関数のアサーション(値や動作の検証)を行うためのさまざまな機能を提供しています。その中のassert.doesNotThrow()は、「指定した関数がエラーをスローしないこと」を検証するためのメソッドです。このメソッドが呼び出されると、引数として渡されたfnが即座に実行されます。

もしfnがエラーをスローした場合、assert.doesNotThrow()はAssertionErrorを発生させます。逆に何もエラーがスローされなければ、検証は成功しプログラムはそのまま処理を続行します。

構文

assert.doesNotThrow(fn, [error], [message])

パラメータ

各パラメータの内容は以下の通りです。

  • fn – assert.doesNotThrow()の実行時に呼び出される関数です。このメソッドはエラーを直接スローする代わりに、ここで指定した関数を実行して検証を行います。

  • error – 対象となるエラーを判定するための正規表現を指定します。省略可能なパラメータです。

  • message – 省略可能なパラメータです。検証失敗時に表示される、ユーザー定義のエラーメッセージを設定できます。

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

npm install assert

assertモジュールはNode.jsに組み込まれた標準モジュールなので、このインストール手順はスキップしても問題ありません。現在のバージョンを確認したい場合は、以下のコマンドを実行してください。

npm version assert

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

関数内でassertモジュールを使用するには、まず以下のようにインポートします。

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

使用例

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

node doesNotThrow.js

例1:エラーがスローされた場合の挙動

doesNotThrow.js

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

try {
    // doesNotThrowメソッドを呼び出してエラーの発生を検証
    assert.doesNotThrow(
        () => {
            throw new TypeError('Wrong value received. Please check !');
        },
    );
} catch(error) {
    console.log("Error:", error)
}

このコードでは、fnの中で意図的にTypeErrorをスローさせています。doesNotThrow()は「期待されない例外」を検知するとAssertionErrorを発生させるため、catchブロックでそのエラーを捕捉できます。

出力結果

C:\home\node>> node doesNotThrow.js
Error: { AssertionError [ERR_ASSERTION]: Got unwanted exception.
Actual message: "Wrong value received. Please check !"
    at Object. (/home/node/test/assert.js:6:9)
    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)
generatedMessage: false,
name: 'AssertionError [ERR_ASSERTION]',
code: 'ERR_ASSERTION',
actual:
    TypeError: Wrong value received. Please check !
       at assert.doesNotThrow (/home/node/test/assert.js:8:9)
       at getActual (assert.js:567:5)
       at Function.doesNotThrow (assert.js:687:32)
       at Object. (/home/node/test/assert.js:6:9)
       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),
    expected: undefined,
    operator: 'doesNotThrow' }

例2:正規表現とメッセージを指定した場合

続いて、errormessageのパラメータを指定した別の例を見てみましょう。

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

try {
    assert.doesNotThrow(
        () => {
            throw new TypeError('Value passed is wrong !!');
        },
        /abcd/,
        'Whoops'
    );
} catch(error) {
    console.log("Error:", error)
}

このケースでは、スローされたTypeErrorが正規表現/abcd/にマッチしないため、doesNotThrow()はその元のエラーをそのまま再スローします。その結果、catchブロックで捕捉されるのはAssertionErrorではなく、元のTypeErrorになります。

出力結果

C:\home\node>> node doesNotThrow.js
Error: TypeError: Value passed is wrong !!
    at assert.doesNotThrow (/home/node/test/assert.js:7:9)
    at getActual (assert.js:567:5)
    at Function.doesNotThrow (assert.js:687:32)
    at Object. (/home/node/test/assert.js:5:9)
    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)

  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を固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン