Node.jsのassert.notDeepEqual()関数の使い方を徹底解説!構文からサンプルコードまで
Node.jsのassertモジュールは、プログラム内で値や条件を検証するためのアサーション機能を多数提供しています。その中のひとつであるassert.notDeepEqual()は、渡された「実際の値」と「期待される値」が深いレベルで等しくないことを確認する関数です。2つの値が深く等しいと判定された場合には、AssertionErrorがスローされます。
構文
assert.notDeepEqual(actual, expected[, message])
パラメータ
actual – 検証の対象となる実際の値を指定します。
expected – actualと比較する、期待される値を指定します。
message – 省略可能なパラメータです。アサーションに失敗した際に出力される、ユーザー定義のエラーメッセージを設定できます。テスト時に原因を把握しやすくなるため、設定しておくと便利です。
assertモジュールのインストール
npm install assert
assertモジュールはNode.jsの組み込みモジュールのため、通常はこのインストール手順を省略できます。最新バージョンの確認が必要な場合は、以下のコマンドでassertモジュールのバージョンをチェックできます。
npm version assert
モジュールの読み込み
const assert = require("assert").strict;
.strictを付けてstrictモードで読み込むことで、より厳密な等価性チェックが行われます。
使用例①:同一の値を比較した場合
まずは「assertNotDeepEqual.js」という名前のファイルを作成し、以下のコードをコピーしてください。ファイル作成後は、次のコマンドで実行できます。
node assertNotDeepEqual.js
assertNotDeepEqual.js
// モジュールを読み込む
const assert = require('assert').strict;
try {
// 両方の値は同一であってはならない
assert.notDeepEqual({ a: '21' }, { a: '21' });
} catch(error) {
console.log("Error: ", error)
}
出力結果
C:\home\node>> node assertNotDeepEqual.js
Error: { AssertionError [ERR_ASSERTION]: Identical input passed to
notDeepStrictEqual:
{
a: '21'
}
at Object.<anonymous> (/home/mayankaggarwal/mysql-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' }
この例では、2つのオブジェクトがどちらも{ a: '21' }であり内容が完全に一致しているため、notDeepEqualの条件(等しくないこと)が満たされず、AssertionErrorがスローされています。
使用例②:異なる型の値を比較した場合
次に、値の型が異なるケースを見てみましょう。
// モジュールを読み込む
const assert = require('assert').strict;
try {
// 両方の値は同一であってはならない
assert.notDeepEqual({ a: 21 }, { a: '21' });
console.log("Values are not identical")
} catch(error) {
console.log("Error: ", error)
}
出力結果
C:\home\node>> node assertNotDeepEqual.js Values are not identical
この例では、片方の値が数値型(number)であるのに対し、もう片方は文字列型(string)です。strictモードでは型まで厳密に比較されるため、2つの値は「深く等しくない」と判定され、エラーは発生せずにメッセージが出力されます。
まとめ
assert.notDeepEqual()は、オブジェクトや配列などの複雑なデータ構造を含む値同士が一致していないことを保証したい場合に役立つ関数です。単体テストなどで「意図的に異なるべき値」を検証する際に活用すると、テストコードの堅牢性を高められます。
-
JavaScriptの関数プロトタイプとは?仕組みと使い方を解説
JavaScriptで作成されたすべての関数には、JavaScriptエンジンによって自動的にprototypeプロパティが追加されます。このprototypeプロパティはオブジェクトであり、デフォルトではconstructorプロパティを含んでいます。関数のプロトタイプには、以下のようにしてアクセスできます。functionName.prototypeコンストラクタ関数を使ってオブジェクトを生成する場合、このprototypeプロパティを活用することで、同じコンストラクタから作成された複数のオブジェクト間でメソッドやプロパティを効率的に共有することができます。これにより、各インスタンスごとに
-
JavaScriptでのメソッド借用:call()・apply()・bind()の使い方を解説
JavaScriptでは、call()、apply()、bind()という3つのメソッドを使うことで、あるオブジェクトが持つメソッドを別のオブジェクトが「借用」できます。これは、本来そのメソッドを持たないオブジェクトに対して、thisの参照先を差し替えてメソッドを実行できる便利なテクニックです。 3つのメソッドの違い call():引数をカンマ区切りで個別に渡し、即座に関数を実行します。 apply():引数を配列(または配列風オブジェクト)として渡し、即座に関数を実行します。 bind():thisを固定した新しい関数を返すだけで、即座には実行されません。返された関数は後から好きなタイミン