RSpecでFileIOをスタブにする
今日したこと
- テスト書いたり諸々
単体テスト、疲れたときに書くと意外と良いかもしれない。 今日は其の途中で得た知見を書いてお茶を濁す。
FileIOをする処理をRSpecで
テスト対象
def file_write File.open('hoge.txt', 'w') do |f| f.print 'fuga' end end
こんなコードをテストしなきゃいけないとき、ファイルに色々と書き出されてしまうので面倒くさい。 また書き出されたファイルの中身が正しいかチェックするのにもファイルを読まないと行けないので大変。
こんな処理の時はStringIO
が便利。
またRSpecでは既存の処理を簡単に置き換えられる。
file = StringIO.new('', 'w') allow(File).to receive(:open).and_yield(file) file_write except(file.string).to eq 'fuga'
FileのOpen時にブロックに渡される引数をStringIOに置き換える。 これでファイルに書き込むはずだった物が簡単に取り出せる。
便利。
ブロックでは無く戻り値を利用してるとき
f = File.open('hoge.txt' , 'w') f.print 'fuga' f.close
なときは。。
allow(File).to receive(:open).and_return(file)
こうする。 戻り値を置き換えることもできる。
どうでもいいはなし
Rubyの勉強していたおかげでこのallowとかその辺の処理がどう実現されているのか大体想像が付くようになってきて嬉しい。 進捗と相談しつつテストを書いて完成度を上げていきたい。