dak ブログ

python、rubyなどのプログラミング、MySQL、サーバーの設定などの備忘録。レゴの写真も。

node.js での json オブジェクトの比較

2021-10-27 00:26:13 | Node.js
node.js で json オブジェクトを比較する方法のメモ

2つの json オブジェクトが一致しているかを比較するために、以下の compare メソッドを作成しました。
module.exports = class JsonUtil {
  static compare(obj1, obj2) {
    if (obj1 instanceof(Array)) {
      if (! (obj2 instanceof(Array))) return false;
      if (obj1.length != obj2.length) return false;
      for (let i = 0; i < obj1.length; i++) {
        const res = JsonUtil.compare(obj1[i], obj2[i]);
        if (! res) return false;
      }
    }
    else if (obj1 instanceof(Object)) {
      if (obj2 instanceof(Array) || ! (obj2 instanceof(Object))) return false;
      if (Object.keys(obj1).length != Object.keys(obj2).length) return false;
      for (let [key, val1] of Object.entries(obj1)) {
        const val2 = obj2[key];
        const res = JsonUtil.compare(val1, val2);
        if (! res) return false;
      }
    }
    else if (obj1 !== obj2) {
      return false;
    }

    return true;
  }
}

上記の compare メソッドで json の比較を行ってみます。
const JsonUtil = require('JsonUtil');

console.log(JsonUtil.compare('abc', 'abc'));
console.log(JsonUtil.compare([1, 2, 3], [1, 2, 3]));
console.log(JsonUtil.compare({"a": 1, "b": 2}, {"a": 1, "b": 2}));
console.log(JsonUtil.compare({"a": 1, "b": 2}, {"a": "1", "b": "2"}));

実行結果は以下の通り想定通りの結果となりました。
true
true
true
false


Node.js のプログラムの単体テスト

2021-10-10 18:03:09 | Node.js
Node.js のプログラムの単体テストを行う方法のメモ。

nodeunit で node.js のプログラムの単体テストを行うことができます。
nodeunit のインストールは以下で行うことができます。
sudo npm install -g nodeunit

単体テストの対象のプログラムの Test1.js と単体テストのプログラムの test_test1.js を以下のディレクトリ構成で配置します。
.
├── lib
│   └── Test1.js
└── test
    └── test_Test1.js

Test1.js は以下のようなプログラムです。
module.exports = class Test1 {
    constructor (str) {
	this.str = str;
    }

    add(str) {
	this.str += str;
	return this.str;
    }

    add2(str1, str2) {
	this.str += str1 + str2;
	return this.str;
    }
}

単体テストのプログラムは、以下のようなプログラムです。
const Test1 = require('../lib/Test1');

module.exports = {
    'test add': function (test) {
	let obj1 = new Test1('abc');
	test.equal(obj1.add('def'), 'abcdef');

	let obj2 = new Test1('uvw');
	test.equal(obj2.add('xyz'), 'uvwxyz');
	
	test.done();
    },

    'test add2': function (test) {
	let obj1 = new Test1('012');
	test.equal(obj1.add2('345', '678'), '012345678');
	test.done();
    }
};

test.equal() は引数の2つの値が等しいかのアサーションです。
テストケースの最後では test.done() を実行します。
nodeunit での単体テストを行うには、単体テストのプログラムがあるディレクトリを引数に指定して nodeunit を実行します。
$ nodeunit test

test_Test1
? test add
? test add2

OK: 3 assertions (17ms)