2013-05-26 2 views
1

Мое любопытство не позволит мне держать язык за зубами. Вот немного кода из Rails Tutorial.Что происходит с объектами модели, созданными в тестах?

describe "profile page" do 
    let(:user) { FactoryGirl.create(:user) } 
    before { visit user_path(user) } 

    it { should have_selector('h1', text: user.name) } 
    it { should have_selector('title', text: user.name) } 
    end 

Что происходит с объектом Factory, созданным здесь после теста, возвращает true или false. Приведенный выше код будет сохранить объект в базу данных, но делает это автоматически получить откат после запуска тестов или же Rails сделать что-то еще с ним: PI было просто интересно, потому что

$ rails console test 
> User.all 

не будет возвращать ничего, но пустой массив.

ответ

3

Обычно, когда вы делаете рельсы генерировать для RSpec, он поместит это в spec_helper.rb

RSpec.configure do |config| 
    config.use_transactional_fixtures = true 
    end 

Это означает, что Rspec будет использовать транзакцию с каждым тестом, и раскатать его обратно после того, как так у вас есть чистый базы данных между каждым тестом. Если вы установите значение false, это не будет сделано.

Factory.create действительно сохраняет запись в базе данных, но она будет откатываться после запуска теста. Поэтому, если вы ищете запись после теста, ее больше нет.

В общем, это лучшая практика, так как не должно быть зависимостей между тестами, и каждый тест должен проверять одну вещь.

+1

Существует также [database_cleaner] (https://github.com/bmabey/database_cleaner), который использует усечение для очистки БД после каждого теста. Я предпочитаю транзакции, но если вы хотите использовать Selenium или capybara-webkit, вам нужно будет использовать database_cleaner. –

+0

Спасибо. Я использую capybara на данный момент, но если я решаю проверить capybara-webkit, я попробую. – TradeRaider

Смежные вопросы