你如何模仿像“每个”这样的方法?

时间:2011-12-07 20:34:51

标签: ruby lambda testunit mocha

我正在尝试测试一个使用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的世界有点令人费解。

2 个答案:

答案 0 :(得分:4)

使用Mocha::Expectations#multiple_yields

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

检查this thread以查看为什么必须在另一个数组中传递行。

答案 1 :(得分:0)

使用Proc对象作为返回值:

Proc.new{ rand(100) }