webtestgithub.com昨日に引き続きgo-webtestの話。現在時刻のような実行の度に値が変わるようなresponseを含んだAPIのテストがしたいとする。いう場合はそもそも固定値を返せるように依存するコンポーネントを注入できるような構成にしておくのが良い。依存の注入方法について注入方法は大まかに以下の2つHandlerを特定のstructのメソッドにして、そのstructのfieldに依存をもたせるHandlerを定義するのではなく、Handlerを生成する関数を定義する(contextにWithValue()で依存を持たせる)1つ目の例は世の中にあふれているので2つ目の例を書くことにする。詳しい話が知りたい場合には以下の記事を読んだ方が早いかもしれない。years(DIコンテナなどがどうこうみたいな話はやり方の話なので省略(例えばwebAPIを作成する時にコード生成(出力)を利用するか手書きするかみたいな話))Handlerを定義するのではなく、Handlerを生成する関数を定義する今回作成するAPIは以下のようなもの。"2019-09-18T18:16:53+09:00"}現在時刻を返すだけのAPI。現在時刻に限らずDBのauto-incrementだとかUUIDだとか入力値に寄らず現在のグローバルな状態を元に生成される値が存在することがある。それらの例のうちもっとも単純なもの例として見て欲しい。Handler関数(http.HandlerFunc)を返す関数として各APIのエンドポイントを定義してあげると、依存はただ単にその関数の引数になる。}}そしてこれらをまとめてhttp.Handlerを返してあげるような関数でラッピングしてあげれば完成。h)}こうしてあげると以下のようにテストが書ける。APIのテストと変わらない感じ。)}便利ですね(とはいえgo-webtestの紹介にはなっていない)。dataが埋まっています。documentなどにexampleとして注入できないかなと妄想していたりもします。既存のコードがゴミの場合はこんなにうまくはいかない。してやろうかと言うのが悩みどころ。場合domainやentity付近で作られているのでだるい(だるい)。ゴミと呼ぶのは良くないですね。time.Nowなどが直接使われているテストのことが全く考えられていないコードのことです。やるのが良いでしょうか?一番単純な方法はパッケージグローバルにnowのような関数を持ちそれを使うという方法かもしれません。個人的には依存が引数の関係性の外に現れるし、気にするべき状態が暗黙に存在することになるので好きではないやり方だったりします。以下のような感じでしょうか?SetNow()などを作るのはオススメしないです。WithNow()というようなteardown的な関数を返すような実装にしておきましょう(どうせSetNow()などが必要になるような設計しかできない人はテストでもどこかでcleanupを忘れる(ちなみにこういう埋め込みのNowに拒絶反応を持つ人はもっと早くにどこかでcleanupを忘れて不快感をつのらせます。prevとか保持する必要無いと思う。}}テストは以下の様な形。io.Closerみたいなメソッドにteardownを持つような定義はテストで必ず実行させたい場合にはオススメしないです。teardownのような関数で返ってきた方がまだマシ。)}こういう依存って1つならまだどうにかなるんですけれど、複数になってくると見た目が直列なのでどの依存が何に対応しているのか追うのが辛くなってくるんですよね。良い方針だとは思えない。(こういう定義がコピペでいろんなパッケージに現れてくると最悪ですね。そこまでひどいものはあまり経験したことが無いですが。「あなたの作っているのはツールですか?アプリですか?ツールならまだ許してあげないこともないですけど」みたいな問答をしたくなるレベル)。responseだけを書き換えたい場合responseだけを書き換えたい場合にも一応は対応しています。いえそれだけで済むことはあまり無いような気もしますが。いうフィールドを受け取れます。ここで返した値がそのテストで取得した値として扱われます。このときwantの中には以前のテストの結果が詰め込まれています。無視したい場合はomitする形でsnapshotをupdateしてくださいとできれば良いんですがまだサポートしていません。現状ではwantもgotも取り除く必要があります。この辺りはもう少し良い方法を考えようかなとおもっています。はじめからmapにしておくと便利かもしれません。)}実はgo-webtest/snapshot/replaceというパッケージを作っていてこちらはsnapshotを読み込むタイミングでの置換をサポートしようと思っているのですがまだ統合が上手くいっていないです。go-webtestというパッケージを作ってました。した作業をするのに欲し...2019-04-06.vueに似た記述からwasmを出力するgo製のツールのvuguについて少し前に微妙にvuguがバズっていた。componentという機能を追加した月別アーカイブはてなブログをはじめよう!podhmoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。