Почему при использовании вызова File.open один раз приводит к тому, что он вызывается 3 раза согласно rspec - PullRequest
1 голос
/ 04 февраля 2010

Ниже вы можете видеть, что я звоню File.open только один раз, но rspec сообщает, что получил его 3 раза.

def self.import_file(filename)
  current_file = filename.split('/').last
  destroy_all(["filename = ?",current_file])

  unpack_format = "A#{INPUT_FILE_FORMAT.map{|element| element[1]}.join("A")}"
  debugger
  File.open(filename, 'r').each do |line|
    hash_created = create_hash(line, unpack_format).merge({:filename=>current_file})
    create(hash_created)
  end
end  

it "should delete previous records with the same filename" do
  Payrec.should_receive(:destroy_all).with(["filename = ?", "testfile.txt"])
  File.should_receive(:open).and_return([@file_line])
  Payrec.import_file "testfile.txt"
end

Выход

<File (class)> expected :open with (any args) once, but received it 3 times

Ответы [ 2 ]

3 голосов
/ 04 февраля 2010

Это далеко не идеально, но для быстрого выяснения того, что на самом деле делают эти вызовы File.open, обезьяна исправит это в верхней части основного сценария:

class File
  class << self
   alias_method :old_open, :open
    def open(*args, &block)
      p args
      block ? block.call(old_open(*args)) : old_open(*args)
    end
  end
end

При каждом вызове File.open аргументы выводятся на экран.

3 голосов
/ 04 февраля 2010

Каждый и его собака зовут File.open. Я мог представить массу причин, по которым он вызвал бы: RSpec читает его файл конфигурации, Rails читает его файл (ы) конфигурации, Cucumber читает его файл конфигурации, отладчик создает временный файл, что-то еще создает временный файл и так далее.

Вы должны проверить , кто звонит File.open, , где происходит этот вызов, что такое аргументы и почему это случается.

Но это то, с чем вам придется иметь дело, устанавливая ожидания для основных методов.

Представьте себе, например, что вы запускаете свои спецификации на Рубиниусе. В Rubinius компилятор написан на Ruby. В настоящее время он не кэширует свои скомпилированные результаты, но вполне возможно, что он может кэшировать их, и тогда он, естественно, будет использовать File.open. Бам! Теперь ваши характеристики случайным образом нарушаются в зависимости от того, достигли вы порога JIT или нет.

Или, что еще хуже: весь Рубиниус широко использует массивы и символы для реализации практически всего. Попробуйте установить некоторые ожидания на эти !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...