Capybara :: ElementNotFound: Невозможно найти css "#transaction_form" - PullRequest
0 голосов
/ 14 ноября 2018

Я учусь писать технические характеристики, используя rspec и capybara.Я пытаюсь написать спецификацию для приложения, которое обрабатывает транзакции.Мой контроллер транзакций выглядит следующим образом:

  def new
    @transaction = Transaction.new
  end

  def create
    transaction = Transaction.new(transaction_params)
    transaction.account = current_account
    if transaction.save && transaction.account.save
      flash[:success] = 'Transaction successfull'
    else
      flash[:danger] = 'Insufficient balance'
    end
    redirect_to root_path
  end

Это выглядит следующим образом транзакции / новые:

<div class = 'row'>
<div class = 'col-xs-12'>
    <%= form_for(@transaction, id: 'transaction_form', :html => {class: 'form-horizontal', role: 'form'}) do |t| %>
        <div class = 'form-group'>
          <div class = 'control-label col-sm-2'>
            <%= t.label :amount %>
          </div>

      <div class = 'col-sm-8'>
        <%= t.text_field :amount, class: 'form-control', placeholder: 'Enter amount', autofocus: true %>
      </div>
    </div>

    <div class = 'form-group'>
      <div class = 'control-label col-sm-2'>
        <%= t.label :transaction_type %>
      </div>

      <div class = 'col-sm-8'>
        <%= t.select :transaction_type, Transaction.transaction_types.keys %>
      </div>
    </div>

    <div class = 'form-group'>
      <div class = 'col-sm-offset-2 col-sm-10'>
        <%= t.submit 'Submit', class: 'btn btn-primary btn' %>
      </div>
    </div>
<% end %>

Я добавил id: transaction_form, чтобы сформировать, чтобы избежать неоднозначной ошибки.Код спецификации выглядит следующим образом:

RSpec.feature 'Transactions', type: :feature do
context 'create new transaction' do
scenario 'should be successfull' do
  visit new_transaction_path
  within('#transaction_form') do
    fill_in 'Amount', with: '60'
  end
  click_button 'Submit'
  expect(page).to have_content('Transaction successfull')
end
end
end

При запуске этой спецификации, однако, я получаю сообщение об ошибке:

 1) Transactions create new transaction should be successfull
    Failure/Error:
       within('#transaction_form') do
         fill_in 'Amount', with: '60'
       end

 Capybara::ElementNotFound:
   Unable to find css "#transaction_form"

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

Кроме того, страница / Transactions / new будет отображаться, только если пользователь вошел в систему. Так это также повлияет на спецификацию транзакции?Если да, то что должно быть сделано?

Пожалуйста, помогите.Заранее спасибо.

1 Ответ

0 голосов
/ 14 ноября 2018

Если страница, с которой вы хотите взаимодействовать, видна только тогда, когда пользователь вошел в систему, то вам необходимо войти в систему пользователя. Это также означает, что вам нужно будет создать пользователя, для которого вы собираетесь войти перед тестом начинается. Обычно это делается с помощью светильников Rails или фабрики (например, factory_bot gem). Как только вы создадите пользователя, вам нужно будет войти в него, что может быть так же просто, как посетить страницу входа и ввести имя пользователя и пароль пользователя. Если вы используете гем для аутентификации, он может предоставить тестовый режим, который позволяет обойти фактическое посещение страницы входа для ускорения тестов (т. Е. Devise обеспечивает это - https://github.com/plataformatec/devise/wiki/How-To:-Test-with-Capybara)

...