2017-02-14 14 views
0

Я новичок в Rails, и я пытаюсь написать тест для функциональности «редактировать пользователя» с capybara, но каждый раз я получаю следующую ошибку:Тестирование функций с помощью Capybara: произошла ошибка после захвата ActiveRecord :: RecordNotFound:

An error occurred in an after hook

ActiveRecord::RecordNotFound: Couldn't find User with 'id'=

occurred at /var/lib/gems/2.3.0/gems/activerecord-4.2.5/lib/active_record/core.rb:155:in `find'

Вот мой код тестирования:

context 'when wrong parameters' do 
      scenario 'checkout name is mandatory' do 
      fill_in 'name', with: '' 
      fill_in 'email', with: '' 
      3.times { wait_for_ajax } 
      click_button '保存' 
      expect(page).to have_current_path('/users/1') 
      expect(page).to have_content 'お名前を入力してください' 
      end 

а вот мой spec_helper.rb и rails_helper.rb

require 'factory_girl_rails' 

    RSpec.configure do |config| 
     config.expect_with :rspec do |expectations| 
     expectations.include_chain_clauses_in_custom_matcher_descriptions = true 
     end 

     config.mock_with :rspec do |mocks| 
     mocks.verify_partial_doubles = true 
     end 
    end 


ENV['RAILS_ENV'] ||= 'test' 
require 'spec_helper' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rspec/rails' 
require 'shoulda/matchers' 
require 'support/authentication_helper' 
require 'capybara' 
require 'support/wait_helper' 
require 'rake' 
require 'support/feature_testing_functions_helper' 

Rails.application.load_tasks 
ActiveRecord::Migration.maintain_test_schema! 

RSpec.configure do |config| 
    config.use_transactional_fixtures = true 
    config.infer_spec_type_from_file_location! 

    config.include FactoryGirl::Syntax::Methods 
    config.include Devise::Test::ControllerHelpers, type: :controller 
    config.include AuthenticationHelper 

    config.include Capybara::DSL, type: :feature 
    config.include Capybara::RSpecMatchers, type: :feature 
    config.include WaitHelper, type: :feature 
    config.include FeatureTestingFunctions, type: :feature 
    Capybara.default_driver = :webkit 
    config.before :suite do 
    Rake::Task['db:drop'].invoke 
    Rake::Task['db:setup'].invoke 
    end 
    config.after :each do 
    Capybara.reset_sessions! 
    end 
end 

Shoulda::Matchers.configure do |config| 
    config.integrate do |with| 
    with.test_framework :rspec 
    with.library :rails 
    end 
end 

Я понятия не имею, почему эта ошибка появилась, есть ли какие-либо рекомендации по устранению неполадок?

ответ

0

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

Другие вопросы в ваших тестах

  1. Вы по всей видимости, с помощью JS, способного драйвера (капибары-WebKit), но до сих пор включено транзакционное тестирование. Это приводит к тому, что любые объекты, которые вы создаете в тестовом коде (FactoryGirl и т. Д.), Не отображаются в приложении. См. - https://github.com/teamcapybara/capybara#transactions-and-database-setup - и затем настройте DatabaseCleaner с использованием рекомендуемой конфигурации от https://github.com/DatabaseCleaner/database_cleaner#rspec-with-capybara-example.

  2. Остановить использование wait_for_ajax - существует около 3 действительных (и очень редких) потребностей для чего-либо вроде wait_for_ajax, ничего другого просто не нужно или указывает на ужасный дизайн приложения. Если вам нужно подождать, прежде чем нажимать кнопку для завершения какого-либо запроса, вы должны ожидать, что все видимые изменения на странице означают, что запрос выполнен (Capybara автоматически ждет/повторяет ожидания на странице) - если нет видимых изменить, как пользователь должен знать, когда они могут или не могут нажать кнопку?

  3. Вы не можете считать, что идентификатор объекта, который вы создаете, будет любым конкретным номером - (/ users/1) и именами пути hardcoding приведет к хрупким испытаниям, если вы когда-либо измените имена маршрутов. Вместо этого используйте рельсы, предоставленные помощникам, чтобы проверить путь. Таким образом, предполагается, что вы создали объект пользователя в качестве переменной с именем user - это было бы

    expect(page).to have_current_path(user_path(user)) 
    

    Таким образом, если вы когда-либо изменить свои маршруты, чтобы иметь путь пользователь на самом деле быть/членом/все тесты не ломаются.

+0

Благодарим за отзыв и ваши отзывы о проблемах. Вот вся строка ошибок «ActiveRecord :: RecordNotFound: Не удалось найти пользователя с« id »=». Здесь id должен быть равен 1, но после знака равенства есть пробел. Почему здесь пусто? Я был бы признателен, если бы вы могли дать подсказку –

+0

@AB. Вы не показываете, где вы создаете пользователя (или вызываете посещение), но это, скорее всего, либо №1 в моем ответе, где код приложения не может видеть пользователя вы создали в тестовом коде из-за тестирования транзакционной базы данных, или это потому, что вы просто строите пользователя, а не создаете его. –