2015-07-29 6 views
0

Я глубоко смущен о моих тестах и ​​один TestCase конкретно:MinitTest TestCase терпит неудачу, когда я запускаю полный набор, преуспевает, когда я запускаю его в одиночку

Когда я бегу все мои тесты интеграции вместе этот конкретный TestCase дает мне это ошибка:


    UsersSignupCapybaraTest 
    test_signup_process_with_capybara        ERROR (5.16s) 
    Capybara::ElementNotFound: Unable to find link or button "Sign up now!" 

При запуске только этот тест он проходит:

 

    UsersSignupCapybaraTest 
    test_signup_process_with_capybara        PASS (10.19s) 
 

Может кто-нибудь объяснить мне это? Вчера я задал аналогичный вопрос here. Я думаю, что я не понимаю некоторые основные механизмы моих тестов. Я ошибаюсь, полагая, что каждый тест протестирован изолированно? Или начинаешь, где раньше остановилось? Это не имело бы смысла, поскольку мне пришлось бы позаботиться о том, как они исполняются, что звучит не так для меня.

Вот файл, содержащий TestCase:

 

    require 'test_helper' 
    class UsersSignupCapybaraTest :chrome) 
     end 
     Capybara.current_driver = :selenium_chrome 
     end 
     test "signup process with capybara" do 
     visit root_path 
     click_on "Sign up now!" 
     fill_in "user_name", with: "Neuer User" 
     fill_in "user_email", with: "[email protected]" 
     # more code ... 
     end 
    end 
 

Вот мой test_helper.rb

 


    # set to test environment 
    ENV['RAILS_ENV'] ||= 'test' 
    # load up the rails application 
    require File.expand_path('../../config/environment', __FILE__) 
    # start minitest 
    require 'rails/test_help' 
    require 'minitest/rails' 
    require 'minitest/rails/capybara' 
    require 'capybara/rails' 
    require 'capybara/poltergeist' 
    require 'minitest/reporters' 

    Minitest::Reporters.use!(
     Minitest::Reporters::SpecReporter.new, 
     ENV 
    ) 

    class ActiveSupport::TestCase 
     ActiveRecord::Migration.check_pending! 
     # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
     fixtures :all 

     # Returns true if a test user is logged in. 
     def is_logged_in? 
     !session[:user_id].nil? 
     end 

     # Logs in a test user. 
     def log_in_as(user, options = {}) 
     password = options[:password] || 'password' 
     remember_me = options[:remember_me] || '1' 
     if integration_test? 
      post login_path, session: { email:  user.email, 
             password: password, 
             remember_me: remember_me } 
     else 
      session[:user_id] = user.id 
     end 
     end 

     private 

     # Returns true inside an integration test. 
     def integration_test? 
     defined?(post_via_redirect) 
     end 
    end 

    class ActionDispatch::IntegrationTest 
     # Make the Capybara DSL available in all integration tests 
     include Capybara::DSL 

     # Logs in a test user. 
     def log_in_as(user, options = {}) 
     password = options[:password] || 'password' 
     remember_me = options[:remember_me] || '1' 
     if integration_test? 
      post login_path, session: { email:  user.email, 
             password: password, 
             remember_me: remember_me } 
     else 
      session[:user_id] = user.id 
     end 
     end 
    end 

    # https://github.com/jnicklas/capybara#transactions-and-database-setup 
    class ActiveRecord::Base 
     mattr_accessor :shared_connection 
     @@shared_connection = nil 

     def self.connection 
     @@shared_connection || retrieve_connection 
     end 
    end 
    ActiveRecord::Base.shared_connection = ActiveRecord::Base.connection 


    # register Capybara driver: Selenium 
    Capybara.register_driver :selenium_chrome do |app| 
     Capybara::Selenium::Driver.new(app, :browser => :chrome) 
    end 
    Capybara.current_driver = :selenium_chrome 
    Capybara.default_wait_time = 5 
 
+0

Я не использовал Minitest столько, сколько rspec. Но эта подобная ситуация разрешена DatabaseCleaner в rspec. Этот ответ может помочь вам решить вашу ситуацию. http://stackoverflow.com/questions/15675125/database-cleaner-not-working-in-minitest-rails – dewdrops

+0

, возможно, попробуйте добавить 'save_and_open_page' к вашим тестам: https://github.com/jnicklas/capybara#debugging –

+0

не могли бы вы разместить свой test_helper.rb, пожалуйста, –

ответ

0

В общем, это происходит, когда некоторые тесты создают какое-то состояние в базе данных или другой слой данных. В вашем случае я подозреваю, что это связано с сеансом пользователя? Возможно, какой-то другой тестовый знак у какого-то пользователя, который не был правильно выписан. Если вы используете devise/warden, возможно, this будет вам полезен.

Хорошая вещь, чтобы начать с, может быть, попытаться добавить save_and_open_page в тесты (docs) после visit root_path и смотреть на состояние страницы, когда набор тестов работает и проверить, если «Зарегистрируйтесь сейчас!» -Button есть.

+0

Я не использую devise/warden. Простое «has_password» для аутентификации. Но я проверю этот метод 'save_and_open_page '. Благодаря! – Flip

0

вам нужен

def teardown 
    Capybara.reset_sessions! 
    Capybara.use_default_driver 
end 

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

class CapybaraTest < ActionDispatch::IntegrationTest 
    include Capybara::DSL 

    def teardown 
    Capybara.reset_sessions! 
    Capybara.use_default_driver 
    super # this might not be necessary - or should maybe be before the other two methods - not sure off the top of my head 
    end 
end 

, а затем выведем тесты, использовать Capybara от CapybaraTest

+0

Эй, Том, я просто переписываю свои тесты. Все было довольно хаотично, и я хочу убедиться, что знаю, что делаю. Попробуй этот подход, когда я туда доберусь. – Flip

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