[Node.js] 順序に関わらず、配列同士が全く同じ要素で構成されているかをテストする

2017.11.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

おばんです、ずっとやりたいと思っていた Destiny2 というゲームを買ってしまい、久々に仕事中でもゲームのことを考えてしまっている田中です。RPG + FPSみたいなゲームでとても面白いです。フレンド募集中です。

では、早速本題です。今回はテストにまつわる話ですが、検証環境は以下の通りです。

配列同士が全く同じ要素で構成されているかどうかをテストする、とは

以下の二つの、含んでいる要素は同じだけど格納されている順番が違う配列を比較した時に、テストが通ることを期待しています。

const array1 = [1, 2, 3]
const array2 = [2, 3, 1]

chaiのassert.sameMembers() を使う

この比較にちょうど良いのが chaiassert.sameMembers() という関数です。以下のように比較することができます。

const assert = require('chai').assert

it('順序に関わらず、二つ配列同士が全く同じ要素で構成されていること', () => {
    const array1 = [1, 2, 3]
    const array2 = [2, 3, 1]
    
    assert.sameMembers(array1, array2)
})

さいごに

assert.sameMembers() の利用シーンとして、DynamoDBのbatchWriteの結果をテストしたい時がありました。DynamoDBのbatchWriteはレコードが順不同に登録されるため、結果とfixtureを比較したい時に assert.deepEqual() を使っても正しい評価が行われないという問題がありました。今回取り扱った assert.sameMembers() を使えば、順不同で同じ要素をもった配列を比較することができるため、相性が良いです。DynamoDBのテストにこの関数を使ったという話ものちほどブログにまとめようと思っています。