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

【Node.js入門】assert.notDeepStrictEqual()関数の使い方を徹底解説

assert.notDeepStrictEqual()関数とは

Node.jsのassertモジュールは、関数のアサーション(妥当性検証)に使用できるさまざまな機能を提供しています。その中のひとつであるassert.notDeepStrictEqual()は、「2つのオブジェクトが深い厳密等価(deep strict equal)ではないこと」を検証するための関数です。もし両方のオブジェクトが厳密に等しい場合には、AssertionErrorがスローされます。

「深い厳密等価」とは?

「deep strict equal」では、オブジェクトの中身を再帰的に(ネストされたプロパティまで含めて)比較しつつ、型変換を行わずに評価します。つまりプリミティブな値に対しては===と同様の厳密な比較が行われるため、'21'(文字列)と21(数値)は等しいとみなされません。

構文

assert.notDeepStrictEqual(actual, expected, [message])

パラメータ

  • actual ─ 比較の対象となる実際の値を指定します。

  • expected ─ actualと比較される期待値を指定します。

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

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

npm install assert

assertモジュールはNode.jsの組み込みモジュールなので、インストールの手順は省略しても問題ありません。最新版のassertモジュールのバージョンを確認したい場合は、以下のコマンドを使用します。

npm version assert

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

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

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

使用例1:異なるオブジェクトを比較した場合

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

node notDeepStrictEqual.js

notDeepStrictEqual.js

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

try {
    // actualとexpectedが等しくないことをチェック
    assert.notDeepStrictEqual({ a: '21' }, { a: '24' });
    console.log("Objects are not equal")
} catch(error) {
    console.log("Error: ", error)
}

出力結果

2つのオブジェクトは異なる値を持っているため、エラーは発生せず正常に処理が完了します。

C:\home\node>> node notDeepStrictEqual.js
Objects are not equal

使用例2:同一のオブジェクトを比較した場合

続いて、もうひとつ例を見てみましょう。今度は同じ値を持つオブジェクト同士を比較します。

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

try {
    // actualとexpectedが等しくないことをチェック
    assert.notDeepStrictEqual({ a: '21' }, { a: '21' });
    console.log("Objects are not equal")
} catch(error) {
    console.log("Error: ", error)
}

出力結果

両方のオブジェクトが同一であるため、アサーションエラーがスローされます。

C:\home\node>> node notDeepStrictEqual.js
Error: { AssertionError [ERR_ASSERTION]: Identical input passed to
notDeepStrictEqual:
{
    a: '21'
}
        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: true,
name: 'AssertionError [ERR_ASSERTION]',
code: 'ERR_ASSERTION',
actual: { a: '21' },
expected: { a: '21' },
operator: 'notDeepStrictEqual' }

まとめ

上記の出力例からもわかるように、両方のオブジェクトは同じ文字列型の'21'という値を持っていたため、notDeepStrictEqual()による検証に失敗し、ERR_ASSERTIONエラーが発生しました。

この関数は、テストコードにおいて「2つの値が一致していないこと」を保証したい場面で活用できます。逆に「一致していること」を検証したい場合は、assert.deepStrictEqual()を使用しましょう。用途に応じて適切なアサーション関数を選ぶことが、堅牢なテストを書く第一歩です。

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