2

モジュールで 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
4

2 に答える 2

0

モジュールのテストに関する問題は、コードの設計方法にあります。エクストラクタを 2 つのクラス (またはモジュール、好みの問題です。テストが少し簡単なので、クラスを使用します) に分割することを考えてみてください。そのうちの 1 つは外部システム コールからデータを読み取り、2 番目はこのデータを期待します。引数として渡されます。

このようにして、現在変数にあるものを簡単にモックできますdata。これは単に引数として渡されるためです (ここで実装の詳細について考える必要はありません!)。

簡単に使用するために、後でいくつかのラッパー呼び出しを提供できます。これにより、両方のオブジェクトが作成され、一方が引数として他方に渡されます。この動作も簡単にテストできることに注意してください。

于 2013-06-20T09:17:33.670 に答える