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 来存根该foreach方法,这样我就可以process_csv从我的测试中控制该方法的输入,而无需任何文件 I/O mumbo-jumbo。

所以测试会是这样的

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数组变成 Mocha 可以使用的东西。我想我必须使用某种 proc 或 lambda,但我发现 procs、blocks 和 lambdas 的世界有点让人费解。

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 回答