我正在尝试测试一个使用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的世界有点令人费解。
答案 0 :(得分:4)
使用Mocha::Expectations#multiple_yields:
CSV.expects(:foreach).multiple_yields([row_array1], [row_array2], ...)
检查this thread以查看为什么必须在另一个数组中传递行。
答案 1 :(得分:0)
使用Proc
对象作为返回值:
Proc.new{ rand(100) }