2016-09-08 2 views
0

Скажите, пожалуйста, почему это происходит?Почему я получаю ошибку в своем приемочном тесте?

Я не могу понять, если я пишу:

feature "Article Creation" do 

#here i write (:all) 

before(:all) do 
    sign_up_helper 
end 

Я получаю ошибку:

Article Creation allows user to visit to creating article page 
Failure/Error: fill_in :article_title, :with => 'test_title' 

Capybara::ElementNotFound: 
    Unable to find field :article_title 

или

1) Article Creation allows user to visit to article page 
Failure/Error: expect(page).to have_content I18n.t('articles.articles_new') 
    expected to find text "New Article:" in "Toggle navigation Blog Rails New Contacts Sign in --- !ruby/hash:ActionController::Parameters controller: devise/sessions action: new {\"controller\"=>\"devise/sessions\", \"action\"=>\"new\"} nil You need to sign in or sign up before continuing. Sign in: Email Password Remember me Sign up Forgot your password?" 

, но, если я пишу:

feature "Article Creation" do 

#here i write(:each) 

before(:each) do 
    sign_up_helper 
end 

Это нормально. Все тесты работают. Мой вопрос - ПОЧЕМУ?

Это мой тест:

*#before all test visitor signs up 
#here I've changed :all and :each* 
feature "Article Creation" do 
before(:all) do 
    sign_up_helper 
end 

scenario "allows user to visit to article page" do 
    visit new_article_path 

    expect(page).to have_content I18n.t('articles.articles_new') 
end 

scenario "allows user to visit to created article page" do 
    visit new_article_path 


    fill_in :article_title, :with => 'test_title' 
    fill_in :article_text, :with => 'example_text' 
    click_button 'Save Article' 

    expect(page).to have_content 'example_text' 
end 

Это метод sign_up_helper:

#spec/support/session_helper.rb 
def sign_up_helper 
    visit new_user_registration_path 

    fill_in :user_email, :with => '[email protected]' 
    fill_in :user_username, :with => 'mike' 
    fill_in :user_password, :with => '[email protected]#' 
    fill_in :user_password_confirmation, :with => '[email protected]#' 

    click_button 'Sign up' 
end 

Это HTML форма:

<p> 
    <label for="article_title">Title</label><br/> 
    <input type="text" name="article[title]" id="article_title" /> 
    </p> 

<p> 
    <label for="article_text">Text</label><br/> 
    <textarea name="article[text]" id="article_text"> 
    </textarea> 
</p> 

ответ

0

Окружающая среда для каждого теста устанавливается заново, я думаю. Новая сессия, файлы cookie и т. Д. Во многих случаях генерируются даже совершенно новые пользователи. Таким образом, один «глобальный» вход невозможен.

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

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

+0

Что делать, чтобы оно было правильно? – Vladimir

+0

Do 'before: each'. –

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