久しぶりに C# での開発現場に戻ってからテストコードを書く時にやっていること - MockHttp -
上記の記事の続きです。
WebMock の想い出
Ruby の開発の現場にいて、最高感があったことの一つに WebMock
がありました。それまでは Web API を利用するようなコードを書く場合は、その Client のコードをまとめて Mock するようなことをする必要があり、個人的にですがやりすぎ感があるなぁと思っていました。
WebMock を使うと主要な HTTP ライブラリを使っている限りはそのリクエストを簡単にモックすることができました。
HttpClient ができていた
久しぶりに C# に戻ってくると HTTP リクエストは HttpClient
がほぼスタンダードになっているようでした。今回私が利用した MockHttp
はその HttpClient
に対しての Mock の振る舞いを提供してくれます。
MockHttp
上述したように HttpClient
を差し替える Mock を簡単に作成できます。
これの基本的なアイデアは HttpMessagingHandler
や DelegatingHandler
を使って HttpClient
の Hook を実装している点です。
なので、Web API の Client ではこの辺りを利用したテストが書かれている事がよく見られます。
MockHttp は Expect
や Match
の記法を提供してくれているため、テストをより可読性が高く、少ない記述で書けるようにしてくれています。
使い方は正直 README 以上のものは私は行っていないので説明はしません。
余談
Ruby では Faraday を使って Web API Client を記述する事が多かったです。Faraday には Middleware という仕組みがあり、それを使って例外処理等を書くことがありました。
Ruby の HTTP Client「Faraday」を使った場合の例外の扱いとリトライ処理をどうするか考えてみた - Qiita
HttpClient
でも Faraday のようにリクエスト前後に Hook を挟めることを学べて良かったです。
一方で HttpClient
は IDisposable
を実装しているにも関わらず、 using
で囲って使うことが(ケースによっては)アンチパターンであったりと、気をつける点もあり「うーーん」と思ったりもしました。
配列もリストも Array
だけで表す Ruby を使っていると、コレクションだけでもかなりの種類がある C# は、もちろん使い分けることが良いのでしょうが面倒に感じてしまうことがあり、もっと簡単にならないかなぁとぼんやり思ったりもしましたが、郷に入っては郷に従えなのでちゃんとやろうと思ったのでした 😅