モジュールで 100% のカバレッジを実現したいと考えています。私の問題は、例外処理をテストするためにデータを挿入しようとしているメソッド内に変数 (データと呼ばれる) があることです。これはモッキングで行うことができますか?そうでない場合、どうすれば例外処理を完全にテストできますか?
module CSV
module Extractor
class ConversionError < RuntimeError; end
class MalformedCSVError < RuntimeError; end
class GenericParseError < RuntimeError; end
class DemoModeError < RuntimeError; end
def self.open(path)
data = `.\\csv2text.exe #{path} -f xml --xml_output_styles 2>&1`
case data
when /Error: Wrong input filename or path:/
raise MalformedCSVError, "the CSV path with filename '#{path}' is malformed"
when /Error: A valid password is required to open/
raise ConversionError, "Wrong password: '#{path}'"
when /CSVTron CSV2Text: This page is skipped when running in the demo mode./
raise DemoModeError, "CSV2TEXT.exe in demo mode"
when /Error:/
raise GenericParseError, "Generic Error Catch while reading input file"
else
begin
csvObj = CSV::Extractor::Document.new(data)
rescue
csvObj = nil
end
return csvObj
end
end
end
end
どう考えているか教えてください!ありがとう
===================== 編集 =======================
あなたが提案したデザインパターンに合わせてメソッドを修正しました。このメソッド-"open(path)" は、エラーのトラップと発生を担当します。get_data(path) はデータを返すだけです。それだけです! しかし、残念ながら rspec では、「例外が発生することが期待されていましたが、何も発生しませんでした」というメッセージが表示されます。スタブからも open メソッドを呼び出す必要があるのではないかと思いましたか?
これは私がやろうとしたことですが、それでもエラーは発生しませんでした..
it 'should catch wrong path mode' do
obj = double(CSV::Extractor)
obj.stub!(:get_data).and_return("Error: Wrong input filename or path:")
obj.stub!(:open)
expect {obj.open("some fake path")}.to raise_error CSV::Extractor::MalformedCSVError
end