2016-01-21 4 views
4

Я новичок в Minitest и Apartment и испытываю трудности при правильной настройке среды для запуска тестовых случаев. Я хочу провести приемочные испытания с использованием Capybara & Selenium. Когда я запускаю свои тесты, я получаю следующее сообщение об ошибке:Как проверить квартиру, минималист, Capybara & Selenium

Apartment::TenantNotFound:   Apartment::TenantNotFound: One of the following schema(s) is invalid: "test-tenant" "public" 

Так что, похоже, арендатор создан неправильно. В квартире драгоценный камень есть инструкции, как использовать его с Rspec, но я не знаю, как сделать аналогичную настройку в Minitest. Как определить арендаторов, чтобы Minitest мог их видеть?

Мой test_helpers.rb:

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require "minitest/reporters" 
require "minitest/rails/capybara" 
Minitest::Reporters.use! 

class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
    fixtures :all 
end 

class ActionController::TestCase 
    include Devise::TestHelpers 
end 

class ActionDispatch::IntegrationTest 
end 

И тест:

require "test_helper" 

class LoginTest < Capybara::Rails::TestCase 
    def setup 
    Apartment::Tenant.drop("test-tenant") rescue nil 
    Apartment::Tenant.create("test-tenant") rescue nil 
    Apartment::Tenant.switch!("test-tenant") 

    # Since we are using Apartment gem, we need to tell Capybara to connect our testing tenant URL + port number 
    Capybara.server_port = 5000 
    Capybara.always_include_port = true 
    Capybara.app_host = "http://test-tenant.lvh.me" 
    end 

    feature "Login" do 
    scenario "with correct credentials", js: true do 
     visit '/accounts/sign_in' 
     fill_in("account[email]", with: "#{accounts(:tenant_user).email}") 
     fill_in("account[password]", with: "password") 
     click_button("Sign in") 
     page.must_have_content("Signed in successfully.") 

     visit '/' 
     page.must_have_content("Welcome") 
    end 
    end 

end 

ответ

2

Я вычислил ответ самостоятельно после тестирования различных комбинаций. Решение на самом деле довольно простое. Все апартаменты & Конфигурации, связанные с Capybara, должны быть определены в файле test_helpers.rb.

test_helpers.rb:

ENV['RAILS_ENV'] ||= 'test' 
require File.expand_path('../../config/environment', __FILE__) 
require 'rails/test_help' 
require "minitest/reporters" 
require "minitest/rails/capybara" 
Minitest::Reporters.use! 


Apartment::Tenant.drop("test-tenant") rescue nil 
Apartment::Tenant.create("test-tenant") rescue nil 
Apartment::Tenant.switch!("test-tenant") 


class ActiveSupport::TestCase 
    # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 
    fixtures :all 
end 

class ActionController::TestCase 
    include Devise::TestHelpers 
end 

class ActionDispatch::IntegrationTest 
end 

# Since we are using Apartment gem, we need to tell Capybara to connect our testing tenant URL + port number 
Capybara.server_port = 5000 
Capybara.always_include_port = true 
Capybara.app_host = "http://test-tenant.lvh.me" 

тест просто:

require "test_helper" 


class LoginTest < Capybara::Rails::TestCase 

    def setup 
    end 


    feature "Login" do 
    scenario "with correct credentials", js: true do 
     visit '/accounts/sign_in' 
     fill_in("account[email]", with: "#{accounts(:tenant_user).email}") 
     fill_in("account[password]", with: "password") 
     click_button("Sign in") 
     page.must_have_content("Signed in successfully.") 

     visit '/' 
     page.must_have_content("Welcome") 
    end 
    end 

end 
+0

Этот подход достаточно хорош, чтобы ускорить проверку рельсов с помощью minitest? У меня было ужасное время с тестированием квартиры с мини-магазином, потому что мне приходилось создавать арендатора каждый раз, когда вызывается метод тестирования. – artificis

+0

Я хочу сказать, что после вашего метода арендатор создается только один раз для одного цикла тестирования? Или он создан до каждого теста? – artificis

+0

Арендатор создается только один раз. Затем он выполнит все миграции для создания таблиц для арендатора. – talakoski

0

Квартира самоцвет вики рекомендует следующую конфигурацию в вашем spec_helper или rails_helper:

RSpec.configure do |config| 
    config.before(:suite) do 
    # Clean all tables to start 
    DatabaseCleaner.clean_with :truncation 
    # Use transactions for tests 
    DatabaseCleaner.strategy = :transaction 
    # Truncating doesn't drop schemas, ensure we're clean here, app *may not* exist 
    Apartment::Tenant.drop('app') rescue nil 
    # Create the default tenant for our tests 
    Company.create!(name: 'Influitive Corp.', subdomain: 'app') 
    end 

    config.before(:each) do 
    # Start transaction for this test 
    DatabaseCleaner.start 
    # Switch into the default tenant 
    Apartment::Tenant.switch! 'app' 
    end 

    config.after(:each) do 
    # Reset tentant back to `public` 
    Apartment::Tenant.reset 
    # Rollback transaction 
    DatabaseCleaner.clean 
    end 
end 

Этот работает для меня, и имеет преимущество не требовать дублирования кода в тестах.

Когда я использовал эту конфигурацию, я столкнулся с проблемой, хотя, когда в тесте использовался AJAX с селеном. Затем я сталкиваюсь с ошибкой Apartment :: TenantNotFound, даже несмотря на то, что конфигурация отлично подходит для не отформатированных JS-тестов.

+0

Спасибо, я думаю, что это справедливо для RSpec, но я хотел бы использовать MiniTest, глупый меня. – talakoski

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