2

CSV.foreachを使用してcsvファイルを読み込み、処理を行うメソッドをテストしようとしています。これは次のようになります。

require 'csv'

class Csv_processor
  def self.process_csv(file)
    begin
      CSV.foreach(file) do { |row|
        # do some processing on the row
      end
    rescue CSV::MalformedCSVError
      return -1
    end
  end
end

CSV.foreachは、入力としてファイルパスを受け取り、ファイルを読み取り、コンマ区切り値を解析して、ファイル内の各行の配列を返します。各配列は、処理のためにコードブロックに順番に渡されます。

Mochaを使用してメソッドをスタブ化し、ファイルI /Omumbo-jumboなしでテストからメソッドforeachへの入力を制御できるようにします。process_csv

したがって、テストは次のようになります

test "rejects input with syntax errors" do
  test_input = ['"sytax error" 1, 2, 3', '4, 5, 6', '7, 8, 9']
  CSV.expects(:foreach).returns( ??? what goes here ??? )
  status = Csv_processor.process_csv("dummy")
  assert_equal -1, status, "Status does not indicate error: #{status}"
end

test_inputアレイをモカが使用できるものに変える方法が必要です。ある種のprocまたはlambdaを使用する必要があると思いますが、proc、blocks、およびlambdaの世界は少し気が遠くなります。

4

2 に答える 2

4

Mocha :: Expectations#multiple_yieldsを使用します:

CSV.expects(:foreach).multiple_yields([row_array1], [row_array2], ...)

このスレッドをチェックして、別の配列内の行を渡す必要がある理由を確認してください。

于 2011-12-07T20:44:14.100 に答える
0

Procオブジェクトを戻り値として使用します。

Proc.new{ rand(100) }
于 2011-12-07T20:37:10.293 に答える