稲沢市よりお届けしてます。

Perlをはじめとしたプログラミング周りのあれこれについて。Perl、最近書いてないなぁ。

Windows10コマンドプロンプトでTest::Mojo したときの日本語文字化け対処

テスト大事だよねって今さら改心した。


昨日『モダンPerl入門』を読んでて、「ナマケモノになるためにテスト書く」っていう感じのところが腑に落ちた。

確かにリファクタリングとか機能追加が億劫になるのって、動いてるものが同じように動くって確信持てずに進めて泥沼化するイメージがあるから。

自動テスト書いて、こまめにチェックして進めれば大胆なリファクタリングも恐れずに進められるしね。ま、Gitでバージョン管理しろとかの話も取り入れていかなきゃだけど、まずはテストを書くことから。

ということで、早速Mojolicious::Liteのアプリのテストを書いてみた。myapp.plのあるディレクトリにtディレクトリを掘って、そこに 01.auth.t っていう名前のテストスクリプトを配置。


Windowsコマンドプロンプトで日本語はダメなのか?

書いたテストは

(1)ログイン画面をGETしたときにHTTPステータス200が返ってきて「ログイン」という文字があるかどうか。

(2)ログイン画面をGETしたときにHTTPステータス200が返ってきて指定したinput タグの要素が存在するかどうか。

テストコードはこんな感じ↓

#!/usr/bin/env perl
use Test::More;
use Test::Mojo;

use FindBin;
$ENV{MOJO_HOME}="$FindBin::Bin/../";
require "$ENV{MOJO_HOME}/myapp.pl";

my $t = Test::Mojo->new;
$t->get_ok('/login')->status_is(200)->content_like(qr/ログイン/);
$t->get_ok('/login')->status_is(200)
    ->element_exists('input[name=csrf_token][type=hidden]')
    ->element_exists('input[name=login_id][type=text]')
    ->element_exists('input[name=password][type=password]');

done_testing;


しかし、文字コード問題に起因するっぽいエラーが出現。「Wide character in print at C:/usr/lib/Test/Builder.pm line 1826, line 399」みたいなエラーメッセージとともに下の画像のようなテスト結果に。

f:id:perl48:20160812003527p:plain

このあたりは、マルチバイト文字の国に生まれた宿命ですな。

6年前にもこんな記事書いてた↓

perl48.hatenablog.com



use utf8; するだけ。

解決は意外とあっさり。さっきのテストコードに「use utf8;」ディレクティブを追加するだけ。

さっきのとウォーリーを探せレベルで変更の少ないテストコード

#!/usr/bin/env perl
use Test::More;
use Test::Mojo;
use utf8;
use FindBin;
$ENV{MOJO_HOME}="$FindBin::Bin/../";
require "$ENV{MOJO_HOME}/myapp.pl";

my $t = Test::Mojo->new;
$t->get_ok('/login')->status_is(200)->content_like(qr/ログイン/);
$t->get_ok('/login')->status_is(200)
    ->element_exists('input[name=csrf_token][type=hidden]')
    ->element_exists('input[name=login_id][type=text]')
    ->element_exists('input[name=password][type=password]');

done_testing;

コマンドプロンプトでも問題なくテストパスしました。

f:id:perl48:20160812003542p:plain


今回のスクリプトの場合は、スクリプト内部に書いた「ログイン」って文字が内部文字コードになってるので、「use utf8」で文字コードをUTF8にしてあげるという感じですね。

Windows XP時代のコマンドプロンプトだと、さらに出力を「cp932」にエンコードしないと文字化けしてたけど、Windows10のコマンドプロンプトは大丈夫みたい。ありがたい。



さ、真の「怠惰」を目指してテストをモリモリ書いていきますよー。





5年前頃、本屋さんで立ち読みしてもチンプンカンプンだった「モダンPerl入門」。やっと内容が理解でき、生かせるレベルになりました。続けることで、僕のPerl力とかその他のパラメータも地味に上がってるんでしょうねー。なんか嬉しい。