Как отменить изменения файловой системы, сделанные в моих тестах Rails / RSpec? - PullRequest
3 голосов
/ 17 декабря 2011

В моих тестах Rails / Rspec я использую файловые ресурсы CRUD.Я хотел бы иметь возможность отменить любое из этих изменений после завершения моих тестов так же, как изменения базы данных отменяются с транзакциями.

  1. Если я добавлю файл для теста, я бы хотелудалить файл после теста.
  2. Если я изменю файл для теста, я бы хотел, чтобы после теста файл был восстановлен в своем прежнем состоянии.
  3. Если я удаляю файл для теста, я хотел бы восстановить файл

Есть ли в RSpec функция или, возможно, другой Gem, который отслеживает изменения файловой системы иможно восстановить в прежнее состояние?Или я должен отменить эти изменения вручную?

В настоящее время я использую Rails3, RSpec2 и Capybara.

Ответы [ 2 ]

5 голосов
/ 01 января 2012

Я воспользовался советом Брайана Джона по всем его пунктам, но подумал, что выложу некоторый код из моего решения на тот случай, если кто-то еще захочет сделать что-то подобное. Я также добавил проверку для пользовательского тега метаданных, так что я делаю это только когда помечаю тестовую группу символом : file

spec_helper.rb

Обратите внимание, что ниже я создаю резервную копию моего каталога #{Rails.root}public/system/ENV/files (где ENV = "test" или "development"), потому что я использую его для тестирования функциональности скрепки, и именно там хранятся мои файлы.

Кроме того, вместо того, чтобы просто выполнить rm -r для структуры каталогов, я восстанавливаю команду --delete rysnc из моего файла резервной копии, которая удалит все файлы, созданные в ходе теста.

RSpec.configure do |config|
  # So we can tag tests with our own symbols, like we can do for ':js'
  # to signal that we should backup and restore the filesystem before
  config.treat_symbols_as_metadata_keys_with_true_values = true

  config.before(:each) do
    # If the example group has been tagged with the :file symbol then we'll backup
    # the /public/system/ENV directory so we can roll it back after the test is over
    if example.metadata[:file]
      `rsync -a #{Rails.root}/public/system/#{Rails.env}/files/ #{Rails.root}/public/system/#{Rails.env}/files.back`
    end
  end

  config.after(:each) do
    # If the example group has been tagged with the file symbol then we'll revert
    # the /public/system/ENV directory to the backup file we created before the test
    if example.metadata[:file]
      `rsync -a --delete #{Rails.root}/public/system/#{Rails.env}/files.back/ #{Rails.root}/public/system/#{Rails.env}/files/`
    end
  end
end

sample_spec.rb

Обратите внимание, что я пометил , что «он должен создать новый файл» с символом : file

require 'spec_helper'

describe "Lesson Player", :js => true do

  it "should create a new file", :file do
    # Do something that creates a new file
    ...
  end

end
3 голосов
/ 17 декабря 2011

Я не знаю каких-либо инструментов, которые делают именно то, что вы ищете, но одним из способов сделать это может быть следующее: 1. Добавьте хук before (: all) к вашему spec_helper.rb, который разбирает структуру каталогов, которую вы хотите восстановить после каждого теста 2. Добавьте до (: each) и after (: all) хуки в ваш spec_helper.rb, которые делают rm -r в вашей структуре каталогов, а затем распакуйте файлы

Другой, возможно, более эффективный способ сделать это - использовать rsync вместо tar. Я считаю, что rsync более умел в отношении только тех изменений, которые нужно перезаписать.

Я верю, что это достигнет вашей цели. Плохо то, что если тесты прерваны, вам придется вручную распаковать файлы.

На самом деле, это звучит как отличная идея для проекта на github, если он еще не существует.

...