Как удалить определенный файл с помощью rspec? - PullRequest
2 голосов
/ 12 февраля 2012

Я искал повсюду, и я надеюсь, что кто-то может ответить на этот вопрос. Я использую следующий код, чтобы заглушить "существует?" метод для FileTest в спецификации rspec:

it "returns no error if file does exist" do
  @loader = MovieLoader.new
  lambda {
    FileTest.stub!(:exists?).and_return(true)
    @loader.load_file
  }.should_not raise_error("File Does Not Exist")
end

Что я действительно хочу сделать, так это убедиться, что существование очень специфического файла будет уничтожено. Я надеялся, что что-то подобное сделает эту работу:

it "returns no error if file does exist" do
  @loader = MovieLoader.new
  lambda {
    FileTest.stub!(:exists?).with(MovieLoader.data_file).and_return(true)
    @loader.load_file
  }.should_not raise_error("File Does Not Exist")
end

Однако, похоже, это не работает. Мне очень трудно найти документацию о том, что на самом деле делает метод with. Возможно, я лаю совсем не на том дереве.

Может кто-нибудь дать какое-нибудь руководство?

1 Ответ

2 голосов
/ 12 февраля 2012

Среда-заглушка RSpec оставляет желать лучшего, и это одна из тех вещей. stub!(:something).with("a thing") гарантирует, что каждый раз, когда вызывается метод something, он получает "a thing" в качестве ввода. Если он получит что-то отличное от "a thing", RSpec остановит тест и сообщит об ошибке.

Я думаю, что вы можете достичь того, чего хотите, вам просто нужно подойти к этому немного по-другому. Вместо того, чтобы заглушить FileTest, вы должны заглушить метод в вашем экземпляре @loader, и этот метод обычно вызывает FileTest.exists?. Надеюсь, это демонстрирует, что я получаю:

class MovieLoader
  def load_file
    perform_loading if file_exists?(file_path)
  end

  def file_exists?(path)
    FileTest.exists? path
  end
end

Ваш тест будет выглядеть так:

it "returns no error if file does exist" do
  @loader = MovieLoader.new
  lambda {
    @loader.stub!(:file_exists?).with(MovieLoader.data_file).and_return(true)
    @loader.load_file
  }.should_not raise_error("File Does Not Exist")
end

Теперь вы заглушаете только один экземпляр загрузчика, поэтому другие экземпляры не будут наследовать заглушенную версию file_exists?. Если вам нужно быть более детальным, вам, вероятно, придется использовать другую среду создания заглушек, которую поддерживает RSpec (stubba, mocha и т. Д.).

...