Предотвратить откат базы данных в спецификации в Ruby on Rails? - PullRequest
4 голосов
/ 14 сентября 2011

При выполнении тестов RSpec в Ruby on Rails 2.3 с ActiveRecord база данных возвращается к состоянию после блока before :all после каждого примера (блок it).

Однако я хочуспецифицировать жизненный цикл объекта, что означает прохождение ряда примеров один за другим, изменение состояния и тестирование постусловий.Это невозможно при поведении отката.

Итак, чтобы уточнить:

describe MyModel
  before :all { @thing = MyModel.create }

  it "should be settable" do
    lambda { @thing.a_number = 42 }.should_not raise_exception
  end

  it "should remember things" do
    @thing.a_number.should == 42
    # this fails because the database was rolled back ☹
  end
end

Есть ли способ сохранить изменения, сделанные в примерах?

Ответы [ 2 ]

2 голосов
/ 14 сентября 2011

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

В некоторых случаях полезно отключить откат, например, для тестов более высокого уровня с Capybara и Selenium, в этом случае вы можете использовать опцию конфигурации use_transactional_fixtures. Вы можете положить это

RSpec.configure do |config|
  config.use_transactional_fixtures = false
end
0 голосов
/ 14 сентября 2011

Ну, это зависит от того, что вы пытаетесь сделать.Если вы тестируете жизненный цикл (последовательность событий, происходящих с течением времени), это скорее сфера интеграционных тестов, которые вы можете встроить в такие инструменты, как Cucumber и т. Д. Spec больше предназначен для проведения небольших тестов небольшихбиты кода.

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

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

...