2016-11-30 3 views
1

Поэтому я хочу убедиться, что это возможно и действительно выполнимо с тем, что я пытаюсь сделать.Capybara with FactoryGirl?

я ранее использовал seeds.rb файл для заполнения базы данных с тестовыми данными, это работает для моих тестов интеграции Капибары, но испортил некоторые из других модульных тестов, которые полагаются на schema.rb файла и фабрики для создания данных.

Могу ли я использовать завод для создания тестовых данных для конкретной спецификации интеграции. Что-то вроде этого на завод:

FactoryGirl.define do 
    factory :user do 
    first_name Faker::Name.first_name 
    last_name Faker::Name.last_name 
    email Faker::Internet.email 
    password "password" 
    end 
end 

Тогда у меня есть супер простой спецификация, которая Логины на сайт в Капибаре:

it 'Check correct login' do 
    visit('/sign_in') 
    page.fill_in 'user_email', :with => '[email protected]' 
    page.fill_in 'user_password', :with => 'p4ssw0rd' 
    click_button('Sign In') 
    end 

Это ударять SQLite базы данных, я могу вставить свой завод и его будет работать с использованием capybara? Я действительно не знаком с factorygirl, но действительно ли он создает данные в базе данных, а затем просто удаляет их?

Я обычно не вижу, как Capybara используется с FactoryGirl во многих примерах, которые я ищу в Интернете, есть ли причина для этого?

редактировать: Вот что я в настоящее время:

it 'Check correct login' do 
    user = FactoryGirl.create(:user) 
    visit('/d/users/sign_in') 
    page.fill_in 'user_email', :with => user.email 
    page.fill_in 'user_password', :with => user.password 
    click_button('Log In') 
    page.assert_text('Signed in successfully.') 
    end 

Я был в состоянии сделать снимок и убедитесь, что формы становятся заполнены со случайным именем пользователя/пароль, но с использованием DB Browser для SQLite Кажется, я не вижу фактических данных в заполняемой базе данных (что может быть затруднено, так как после того, как спецификация завершена, она удалена правильно?), Но я не могу сказать, действительно ли она создает данные или нет.

Спасибо!

ответ

1

Это должно нормально работать с множеством зацепов. Вам нужно будет создать экземпляр объекта User в своем тесте, поскольку это выглядит как «вход».

Вы можете создать объект несколькими способами.

(1)

describe 'Test' do 
    let(:user){ create :user } 
    ... 
    it 'Specific Test' do 
    ... 

Обратите внимание, что let!(:user){...} создает сразу и let(:user){...} только создаст пользователя, когда user называется. Затем вы сможете получить доступ к user во всех своих тестах.

(2)

describe 'Test' do 
    before do 
    @user = FactoryGirl.create(:user) 
    end 
    it 'Specific Test' do 
    ... 

Здесь вы сможете получить доступ к @user во всех ваших тестов.

Сообщите нам, если это работает, и если не ошибка, которую вы получаете.

EDIT:

Если файл FG выглядел следующим образом:

FactoryGirl.define do 
    factory :user do 
    first_name Faker::Name.first_name 
    last_name Faker::Name.last_name 
    email Faker::Internet.email 
    password "password" 
    work 
    end 
end 

Вы могли бы связать работу так:

let(:user){ create :user, work: 'Some Place' } 
@user = FactoryGirl.create(:user, work: 'Some Place') 
+0

Что я использую для FILL_IN-х годов? 'Faker :: Internet.email' и' password'? Также есть «лучшая практика» в «let!» vs «let» – msmith1114

+1

Я не использовал Faker, на самом деле, но это выглядит правильно. Вы также можете просто вставить строку '' fake-email @ email.org'' и '' password'' в файл FactoryGirl. Вы также можете помещать ассоциации в файл FG, просто оставляя их пустыми и ссылаясь на них при создании экземпляра: 'let! (: User) {create: user, work: 'Some Place'}' Что касается 'let!' Или ' пусть 'это в основном ленивая проблема с загрузкой - не нужно загружать вещи, которые вы не используете, но если вы не знаете, что делаете, ваш тест может не сработать, потому что ваш объект, на ваш взгляд, отсутствует! :-) Я добавлю код в ответ. –

+0

@ msmith1114 Для fill_in вы должны использовать либо 'page.fill_in 'user_email', с помощью: user.email' или' page.fill_in 'user_email', с помощью: @ user.email' в зависимости от того, используете ли вы 'let' или создавать собственные переменные экземпляра в блоке перед блоком. –

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