それはこのように見えるためにブロックを取る方法のためのRubyでかなり一般的です:yieldを返すメソッドを適切に模倣するにはどうすればよいですか?
class File
def open(path, mode)
perform_some_setup
yield
ensure
do_some_teardown
end
end
それはこのように見える方法にもかなり慣用的です:
def frobnicate
File.open('/path/to/something', 'r') do |f|
f.grep(/foo/).first
end
end
私はのための仕様を書きたいですファイルシステムにヒットしない、この、それはファイルのうち、右の単語を引っ張るようなことを保証する:
describe 'frobnicate' do
it 'returns the first line containing the substring foo' do
File.expects(:open).yields(StringIO.new(<<EOF))
not this line
foo bar baz
not this line either
EOF
expect(frobnicate).to match(/foo bar baz/)
end
end
ここで問題があることがMOCによって、あります王はFile.open
への呼び出しから、私はまたfrobnicate
がnil
を返すことを意味するその戻り値を削除しました。しかし、File.returns('foo bar baz')
のようなものをチェーンに追加すると、興味のあるコードに実際には当たらないテストに終わるでしょう。 frobnicate
のブロックの内容は何かを行う可能性があり、テストは引き続き行われます。
私のfrobnicate
メソッドを適切にテストするには、ファイルシステムを使用しないでください。私は特に特定のテストフレームワークには添付されていないので、あなたの答えが "あなたのためにそれを行うこの素晴らしい宝石を使用する"場合は、私はそれで大丈夫です。
ああ、構文エラーについては申し訳ありません。 MWEを取得するために元のコードをたくさんカットしました。あなたの解決策がrspec-mocksを経由するように見えますが、私が書いたものはMocha経由です。残念ながら、私はあなたの解決策を使うときに '未定義のメソッドを許可する'を得ています。私はrspec 3.4.1です。 – ymbirtt
Rubyのバージョンは何ですか? – flanger001
無視 - 私はモカとの衝突を避けるためにテスト設定を更新しました。 – flanger001