Как вы издеваетесь над методом, подобным «каждому»? - PullRequest
2 голосов
/ 08 декабря 2011

Я пытаюсь проверить метод, который использует 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 из моего теста без какого-либо файлового ввода-вывода 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 в то, с чем может работать Мокко. Я думаю, что мне нужно использовать какой-нибудь метод или лямбду, но я нахожу мир проков, блоков и лямбд немного изумительным.

Ответы [ 2 ]

4 голосов
/ 08 декабря 2011

Использование Мокко :: Ожидания # множественные поля :

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

Проверьте этот поток , чтобы понять, почему вы должны передавать строки в другой массив.

0 голосов
/ 08 декабря 2011

используйте Proc объект в качестве возвращаемого значения:

Proc.new{ rand(100) }
...