久しぶりに C# での開発現場に戻ってからテストコードを書く時にやっていること - MockHttp -

dany1468.hatenablog.com

上記の記事の続きです。

WebMock の想い出

github.com

Ruby の開発の現場にいて、最高感があったことの一つに WebMock がありました。それまでは Web API を利用するようなコードを書く場合は、その Client のコードをまとめて Mock するようなことをする必要があり、個人的にですがやりすぎ感があるなぁと思っていました。

WebMock を使うと主要な HTTP ライブラリを使っている限りはそのリクエストを簡単にモックすることができました。

HttpClient ができていた

久しぶりに C# に戻ってくると HTTP リクエストは HttpClient がほぼスタンダードになっているようでした。今回私が利用した MockHttp はその HttpClient に対しての Mock の振る舞いを提供してくれます。

MockHttp

github.com

上述したように HttpClient を差し替える Mock を簡単に作成できます。

これの基本的なアイデアHttpMessagingHandlerDelegatingHandler を使って HttpClient の Hook を実装している点です。

なので、Web API の Client ではこの辺りを利用したテストが書かれている事がよく見られます。

github.com

github.com

MockHttp は ExpectMatch の記法を提供してくれているため、テストをより可読性が高く、少ない記述で書けるようにしてくれています。

使い方は正直 README 以上のものは私は行っていないので説明はしません。

余談

Ruby では Faraday を使って Web API Client を記述する事が多かったです。Faraday には Middleware という仕組みがあり、それを使って例外処理等を書くことがありました。

Ruby の HTTP Client「Faraday」を使った場合の例外の扱いとリトライ処理をどうするか考えてみた - Qiita

HttpClient でも Faraday のようにリクエスト前後に Hook を挟めることを学べて良かったです。
一方で HttpClientIDisposable を実装しているにも関わらず、 using で囲って使うことが(ケースによっては)アンチパターンであったりと、気をつける点もあり「うーーん」と思ったりもしました。

配列もリストも Array だけで表す Ruby を使っていると、コレクションだけでもかなりの種類がある C# は、もちろん使い分けることが良いのでしょうが面倒に感じてしまうことがあり、もっと簡単にならないかなぁとぼんやり思ったりもしましたが、郷に入っては郷に従えなのでちゃんとやろうと思ったのでした 😅