ぬまのそこ

namazuのゆるいエンジニアブログ

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とかその辺の処理がどう実現されているのか大体想像が付くようになってきて嬉しい。 進捗と相談しつつテストを書いて完成度を上げていきたい。