Как создать пользователя, выполнившего вход, перед выполнением теста функциональности Rspec? - PullRequest
0 голосов
/ 29 апреля 2019

Я пытаюсь написать функциональный тест (используя Rspec 3 и Capybara), который тестирует пользователя, добавляющего адрес (строку) и получая координаты в ответ.Пользователи должны войти в систему, прежде чем они смогут сделать это, так как я могу создать пользователя и затем выполнить эту функцию?Я получаю следующую ошибку:

Failure/Error: fill_in 'text_field_tag', with: q

     Capybara::ElementNotFound:
       Unable to find field "text_field_tag" that is not disabled

Вот код, который у меня есть.

find_coordinates_spec.rb

feature 'find coordinates' do
  scenario 'with valid place name' do
    user = User.create(email: 'test@test.com', password: "password", password_confirmation: "password")
    sign_in user
    geocode('London')
    expect(page).to have_content('51.5073219, -0.1276474')
  end

  def geocode(q)
    visit locations_path
    fill_in 'text_field_tag', with: q
    click_button 'geocode'
  end
end

location_controller.rb

class LocationsController < ApplicationController
  before_action :authenticate_user!

  def index
    if params[:q].blank?
      @message = 'Please enter an address in the field!'
      return
    end

    token = Rails.application.credentials.locationiq_key
    search = LocationiqApi.new(token).find_place(params[:q])

    # Hash#dig will return nil if ANY part of the lookup fails
    latitude = search.dig('searchresults', 'place', 'lat')
    longitude = search.dig('searchresults', 'place', 'lon')

    if latitude.nil? || longitude.nil?
      # Output an error message if lat or lon is nil
      @coordinates = "We couldn't find a place by this name. Please enter a valid place name."
    else
      @coordinates = "Coordinates: " + "#{latitude}, #{longitude}"
    end
  end
end

location.html.erb

<main>
  <h1>Location Search</h1>
  <!-- devise flash messages -->
  <p class="notice"><%= notice %></p>
  <p class="alert"><%= alert %></p>
  <!-- Button to search coordinates -->
  <%= form_tag(locations_path, method: :get) do %>
    <%= text_field_tag(:q) %>
    <%= submit_tag("geocode") %>
    <%= @message %>
  <% end %><br>

  <%= @coordinates %>
</main>

Ответы [ 2 ]

1 голос
/ 29 апреля 2019

Ваша ошибка не из-за невозможности создать пользователя.Просто чтобы убедиться, что аутентификация прошла нормально, вы можете добавить после visit locations_path:

  expect(page).to have_content('Please enter an address in the field')

Фактическая ошибка в том, что ваше поле ввода называется q, а не text_field_tag:

  fill_in "q", with: q
0 голосов
/ 29 апреля 2019

Вы получаете эту ошибку из-за этой строки:

fill_in 'text_field_tag', with: q

Согласно документации Capybara на #fill_in:

Поле можно найти по его имени, идентификатору, атрибуту Capybara.test_id или тексту метки

text_field_tag - это не атрибут html, а помощник вида rails. Вы должны изменить, если с идентификатором, меткой или именем text_field_tag

...