Hatena::Groupsubtech

NaN days

ブログを移転しています。最新の記事は motemen.hatenablog.com へどうぞ

2012-10-03

Test::Deep で JSON をパーズした結果と比較できる Test::Deep::JSON というのを書きました

| 13:56 | Test::Deep で JSON をパーズした結果と比較できる Test::Deep::JSON というのを書きました - NaN days を含むブックマーク はてなブックマーク - Test::Deep で JSON をパーズした結果と比較できる Test::Deep::JSON というのを書きました - NaN days

すぐに使いたくなったので、さきほど shipit いたしました。https://metacpan.org/release/MOTEMEN/Test-Deep-JSON-0.01/

https://github.com/motemen/Test-Deep-JSON

適当な hashref があって、その一部が JSON 形式文字列になっているようなとき (HTTP API のテスト時など) に code() でなんとかするのもあらかじめパーズしておくのも面倒なので、こんなときに Test::Deep で使える関数を提供するモジュールを書きました。

SYNOPSIS を見ていただければ使い方がわかると思います。

use Test::Deep;
use Test::Deep::JSON;

cmp_deeply {
    mode => 'hoge',
    payload => '{"a":1}',
}, {
    mode => ignore(),
    payload => json({ a => 1 }),
};

こんな風に Test::Deep の expected 部に使えるクラスを作る際には、以下のことを知っておくと便利そうです:

  • use Test::Deep::Cmp する
    • すると (/^Test::Deep::/ なパッケージの場合) @ISA に Test::Deep::Cmp が入ります
  • $self->descend($got) を実装する
  • diagnostics か diag_message も実装しておくとよし
  • expected の実体は $self->{val} に保持しておく
    • と diag 時のメッセージとかによしなに使われるっぽい

テストのテストには Test::Tester が便利そうですね。ひとつの関数呼び出しで複数テストが走ってびっくりするけど。