результат теста rspec из файла макета csv.read

Я использую рубин 1.9 и пытаюсь сделать BDD. Мой первый тест «следует читать в csv» работает, но второй, где мне нужно, чтобы насмехался над файловым объектом, - нет.

Вот моя модель:

require 'spec_helper'

describe Person do
  describe "Importing data" do
    let(:person) { Person.new }

    let(:data) { "title\tsurname\tfirstname\t\rtitle2\tsurname2\tfirstname2\t\r"}
    let(:result) {[["title","surname","firstname"],["title2","surname2","firstname2"]] }

    it "should read in the csv" do
      CSV.should_receive(:read).
        with("filename", :row_sep => "\r", :col_sep => "\t")
      person.import("filename")
    end

    it "should have result" do
      filename = mock(File, :exists? => true, :read => data)
      person.import(filename).should eq(result)
    end
  end
end

Вот код на данный момент:

class Person < ActiveRecord::Base
  attr_accessor :import_file

  def import(filename)
    CSV.read(filename, :row_sep => "\r", :col_sep => "\t")
  end
end

Я в основном хочу имитировать файл, чтобы, когда метод CSV пытается прочитать из файла, он возвращал мою переменную данных. Затем я могу проверить, соответствует ли она моей переменной результата.


person map7    schedule 07.03.2011    source источник
comment
Можете ли вы опубликовать трассировку стека неисправной спецификации? Вы inspect макет, чтобы убедиться, что это то, что вы думаете?   -  person jhwist    schedule 07.03.2011


Ответы (1)


Вы можете заглушить File.open:

let(:data) { "title\tsurname\tfirstname\rtitle2\tsurname2\tfirstname2\r" }
let(:result) {[["title","surname","firstname"],["title2","surname2","firstname2"]] }

it "should parse file contents and return a result" do
  expect(File).to receive(:open).with("filename","rb") { StringIO.new(data) }
  person.import("filename").should eq(result)
end

StringIO по существу обертывает строку и заставляет ее вести себя как объект ввода-вывода (в данном случае - файл)

person zetetic    schedule 08.03.2011