DevDevデブ!!

プログラミングのこととか書きます。多分。。。

Thorで作った対話型コマンドをテストする方法

最近ThorでCLIコマンドを自作することが多い。 普通にテストするだけなら以下の記事の方法で問題無い

qiita.com

対話型コマンドの場合、テスト時にどうやって入力を与えればいいのか分からず、ちょいとハマってた。

解決方法:標準入力をモックすればよい

解決法は単純で、標準入力をモックすればよかった。

利用したテストダブルのライブラリは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が返却されるようになる。

欲を言えば、配列で指定した順番に返却してくれたりすると嬉しいんだけど、そういう感じの指定方法ってできないのかな?