Результат теста rspec из файла макета csv.read - PullRequest
17 голосов
/ 07 марта 2011

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

1 Ответ

27 голосов
/ 08 марта 2011

Вы можете заглушки 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, по сути, оборачивает строку и заставляет ее вести себя как объект ввода-вывода (в данном случае, Файл)

...