Test::DifferencesでUTF-8文字列をエスケープせずに出力する方法
ドキュメントに書いてある、 Text::Diff
の設定をどうこうする方法では駄目だったのでいろいろ調べた感じ、以下のようにすれば行けた。
use strict; use warnings; use utf8; use Data::Dumper; { package Data::Dumper; our $Useperl = 1; no warnings 'redefine'; sub qquote { shift; } } use Term::Encoding qw(term_encoding); use Test::More; { my $builder = Test::More->builder; my $term_encoding = term_encoding; binmode $builder->output, ":encoding($term_encoding)"; binmode $builder->failure_output, ":encoding($term_encoding)"; binmode $builder->todo_output, ":encoding($term_encoding)"; } use Text::Diff::Config; $Text::Diff::Config::Output_Unicode = 1; use Test::Differences; eq_or_diff 'あいうえお', 'かきくけこ'; done_testing;
Data::Dumperがまず問題
Test::Differences
では内部的に Data::Dumper
を使用しており、そこで確実にエスケープされてしまうので、まずはその対処をしなければならない。
これはまともな方法ではどうにもならないので、以下のページを参考に qquote()
をハックする方法で対処した。
Data::DumperでUTF-8フラグつき文字列をエスケープさせないようにするには - ku
Test::Moreの出力をなんとかしないと、 Wide character in print...
が出ます
これはいつものアレ。最近 Test::More
も中身が Test2
になったりしてるみたいでよくわからないが、まだこのやり方でとりあえず通用した。
Test::Moreでマルチバイト文字列を出力する可能性がある場合。 - 遠い叫び
Text::Diffの設定をなんとかする
$Text::Diff::Config::Output_Unicode
を真にするだけ。なおこの設定、table_diff
以外では不要なので、 unified_diff
とかを使う場合はなくてもよい。
Test::Differences使わない方がいいんじゃないか説
あまりちゃんとメンテされてない感じだし、使わなくて済むならそうした方がいいかも。今は似たようなのでもっといいのあるんじゃない?