1. tanaken on Rails
  2. #018: Rails console, asserti..
2024-05-04 08:20

#018: Rails console, assertionless tests, date decoder

00:01
第18回のTanaken on Railsです。今週のThis Week in Railsから、3つ紹介します。
1つ目、Build Rails Console on top of IRB's latest official APIs、Railtiesに関する変更です。
IRBのバージョンを、バージョン1.13に更新しました。このIRBのバージョンで提供されている
extendirbという機能を使って、5つのコマンド、helper、controller、new session、up、reloadびっくり、
この5つのコマンドを実装し直しています。これらのコマンドは、今回の変更前は、
monkey patchを当てる形で拡張されており、helpメッセージにも出てきていませんでした。
なので、ちょっと見つけづらいコマンドになっていたと。今回の変更で、このextendirbという
機能に従って実装したことで、helpページにもきれいに記載されるようになっているよということですね。
このextendirbという機能は、なかなか便利そうだったので、ちょっと使ってみたいなと思いましたね。
リンクを書本に貼ってあるので、ぜひ見てみてくださいというところです。
2つ目、allow assertionless tests to be reportedというプリリクエストです。
こちらは、アクティブサポートに関する変更です。
アサーションが一度も呼ばれないテストコードが実行された場合に、例外を挙げることができるようになりましたと。
アサーションが一度も呼ばれない場合があるテストコードというのはどんなコードですかというので、
プリリクエストに例が書いてあるので紹介すると、例えば、testactiveというテストコードがあるとしましょう。
activeusersというのをuser.activeで取得してきて、
このactiveusersに対して、位置を回して、ユーザーを1件ずつアクティブかどうかアサートすると。
そんなテストがあったとしましょうと。
このテスト1件よく見えるんですけど、
このactiveusersというデータが0件だった場合、一度もアサーションが呼ばれないというテストになっています。
03:03
このテスト一度もアサーション呼ばれてないんですけど、
つまり一度も呼ばれずに、一度もエラーにならないので、テストが通っちゃうんですよね。
つまりこれ今、activeusersを取ってきて、1件ずつアクティブかどうかをチェックするという、
アサートになってるんですけど、これ一度もアサーション呼ばれないんで、
アサーションの内容っていうのは何でもいいともはや。
つまりactiveusersを取ってきて、アサート、
not activeみたいな感じのユーザーを1件ずつアクティブじゃないんじゃないかというアサートをやったとしても、
アサートは1個も呼ばれないんで、テスト通っちゃうんですよね。
こういうのは良くないテストだと。
こういったテストを発見したいですよねというのが前提としてあって、
今回アクティブサポートにオプションが追加されました。
config.activesupport.assertionlesstestbehaviorという、
アサーションレスなテストのビハイビアをどうしますかというオプションが追加されて、
選択肢はraiseあるいはlogあるいはignoreこの3つですね。
raiseかlogかignoreが選べるようになったと。
オプションにraiseを指定すると、
アサーションが1度も呼ばれないテストコードが実行された場合に例外が発生すると。
エラーになるということですね。
続いて2点目のlogを指定した場合は、
アサーションが1度も呼ばれないテストコードが実行されたときに、
logだけ出力されるようになると。
最後ignoreを指定すると、
アサーションが1度も呼ばれないテストコードが実行されたとしても何も起きない。
今までと一緒になるということです。
こういったのを使って、
本当は良くないテストなのに通っちゃってるっていうものを発見できたら嬉しいですよねということですね。
ありがたい。
最後3点目のプレリクエスト。
タイトルがAdd a Date Decoder to the BG Adapter.
アクティブレコードに関する変更です。
PostgreSQLのアダプターにデート型のデコーダーが追加されましたというお話です。
何かというと、具体的にはこれまでSQLの方でデート型にキャストしていても、
アクティブレコードでセレクトするとストリング型になってしまっていたと。
06:06
例えば、active-record://base.connection.selectvalueで括弧の中身でSQLを打つと。
っていうのがあって、そのSQLの中身がセレクト、
シングルクオーテーションで、2024年の1月1日、0101でコロンコロンデイト、
PostgreSQLの日付、2024年1月1日っていう文字列で日付を書いて、デート型にキャストするっていうクエリ。
つまり、2024年1月1日をデート型にするぞというのをセレクトしたというクエリ。
こいつをアクティブレコードで実行する、呼び出すんだけど、値を取ってくると文字列になっちゃうと。
ストリングになってしまうという問題がございました。
今回のプレリクエストの変更によって、さっきと同じ、今と同じ処理を実行すると、ちゃんとデート型で日付が取れるようになるということですね。
こういう変更が行われましたということですね。
これは今PostgreSQLの話だけしてたんですけど、MySQL 2アダプターにもすでに同様の処理は実装されているそうです。
なので今回の変更によって、このデート型のデコーダーに関しては、PostgreSQLのアダプターの機能がMySQL 2アダプターの機能に追いついたという感じですね。
ということで、PostgreSQLを使っている皆さんには嬉しい話かなと思います。
そんなところで3点紹介しました。
今週のたねけんオンレイルスはこの辺りとします。
ではまた来週。バイバイ。
08:20

コメント

スクロール