Thorで作った対話型コマンドをテストする方法
最近ThorでCLIコマンドを自作することが多い。 普通にテストするだけなら以下の記事の方法で問題無い
対話型コマンドの場合、テスト時にどうやって入力を与えればいいのか分からず、ちょいとハマってた。
解決方法:標準入力をモックすればよい
解決法は単純で、標準入力をモックすればよかった。
利用したテストダブルのライブラリはRR
stub($stdin).gets { "hoge" } Hoge.new.invoke :hoge, [] {}
ただ、上記の方法だと何回$stdin.getsしても同じ値が帰ってくるようになるので、ユーザに入力を複数回求める場合は使用できない。 そういった場合は以下のようにする。
stub($stdin).gets.times(1) { "hoge" } stub($stdin).gets.times(1) { "fuga" } Hoge.new.invoke :hoge, [], {}
上記のように指定すると、一回目はhoge、二回目はfugaが返却されるようになる。
欲を言えば、配列で指定した順番に返却してくれたりすると嬉しいんだけど、そういう感じの指定方法ってできないのかな?