Тестирование многодоменного приложения Rails 3 с Capybara - PullRequest
9 голосов
/ 18 января 2011

Я хочу протестировать свое многодоменное приложение RoR3.

Вот мой test_helper.rb

ENV["RAILS_ENV"] = "test"

require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
require 'capybara/rails'
require 'blueprints'

class ActiveSupport::TestCase

end

class ActionDispatch::IntegrationTest
  include Capybara

  def host
    "http://#{subdomain}.lvh.me:3000"
  end

  def subdomain
    @subdomain ? @subdomain : 'demostore'
  end

  def visit(url)
    super("http://#{subdomain}.lvh.me:3000#{url}")
  end
end

И мой интеграционный тест:

require 'test_helper'

class ProductsTest < ActionDispatch::IntegrationTest

  def setup
    @subdomain = 'demostore'
    # creating stuff
  end

  def teardown
    # deleting stuff
  end

  test "user views product list" do
    visit('/')
    assert page.has_css?('ul.product-listing')
    assert page.has_xpath?("//ul[@class='product-listing']/li", :count => 12)
  end

  test "user views product page" do
    product = Product.first

    visit('/')
    find(:xpath, "//ul[@class='product-listing']/li/a[1]").click
    save_and_open_page
  end

end

И я уверен, что ссылка существует. Существует проблема с нажатием и заполнением.

click_link('Existent link title')

тоже не работает.

Я думаю, что драйвер Rack :: Test по умолчанию для Capybara может иметь проблемы с этим многодоменным материалом?

Ответы [ 6 ]

1 голос
/ 08 мая 2013

Я хотел бы поделиться тем, что я нашел отличным решением этой проблемы. Он включает создание вспомогательного метода для добавления URL-адресов к желаемому поддомену, не перезаписывает никакие методы Capybara и работает с драйверами Rack :: Test и capybara-webkit. Фактически, это будет работать даже в спецификациях, которые даже не используют Capybara. (источник: http://minimul.com/capybara-and-subdomains.html)

Метод Spec Spec Helper

# spec/support/misc.helpers.rb
def hosted_domain(options = {})
  path = options[:path] || "/" # use root path by default
  subdomain = options[:subdomain] || 'www'
  if example.metadata[:js]
    port = Capybara.current_session.driver.server_port
    url = "http://#{ subdomain }.lvh.me:#{ port }#{ path }"
  else
    url = "http://#{ subdomain }.example.com#{ path }"
  end
end

<ч />

И чтобы проиллюстрировать его использование, вот два примера:

Используется в спецификации объекта (с капибарой)

require 'spec_helper'

describe "Accounts" do
  # Creates an account using a factory which sequences
  # account subdomain names
  # Additionally creates users associated with the account
  # using FactoryGirl's after callbacks (see FactoryGir docs)
  let (:account) { FactoryGirl.create(:account_with_users) })

  it "allows users to sign in" do
    visit hosted_domain(path: new_sessions_path, subdomain: account.subdomain)

    user = account.users.first

    fill_in "email", with: user.email
    fill_in "password", with: user.password
    click_button "commit"

    # ... the rest of your specs
  end
end

Используется в спецификации запроса (без капибары)

#spec/requests/account_management_spec.rb
require "spec_helper"

describe "Account management" do
  # creates an account using a factory which sequences
  # account subdomain names
  let (:account) { FactoryGirl.create(:account) })

  it "shows the login page" do
    get hosted_domain(path: "/login", subdomain: account.subdomain)
    expect(response).to render_template("sessions/new")
  end

end
1 голос
/ 06 января 2013

Вот быстрая настройка, которая может вам помочь ...

rails 3.2+ тестирование пользовательских поддоменов с использованием огуречной капибары с настройкой pow:

https://gist.github.com/4465773

1 голос
/ 16 февраля 2011

Видимо, это проблема с тестом в стойке.

Но есть одна ветка от hassox , которая только что решила это для меня. Это всего лишь пара коммитов, которые действительно имеют значение, на случай, если вы захотите проверить, что это за изменения.

Вот так выглядит мой Gemfile:

group :test, :cucumber do
  gem 'rack-test', :git => "https://github.com/hassox/rack-test.git"
  gem 'capybara', '= 0.4.1.2'
  gem 'capybara-envjs', '= 0.4.0'
  gem 'cucumber-rails', '>= 0.3.2'
  gem 'pickle', '>= 0.3.4'
end

А потом я просто проверяю

visit('http://my_subdomain.example.com')

в моих шагах. Теперь я пытаюсь понять, как заставить помощников URL работать с поддоменами.

1 голос
/ 25 января 2011

Проблема заключалась в том, что я использую многодоменные вещи, поэтому мне пришлось использовать lvh.me, который разрешает localhost. Вы можете сделать то же самое, установив в вашем / etc / hosts

127.0.0.1 subdomain.yourapp.local

, а затем использовать этот домен.

Я переписал метод посещения Капибары следующим образом:

def visit(link)
  super("mysubdomain.lvh.me:3000#{link}")
end

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

Таким образом, решение заключается в установке хоста и порта в настройках Capybara:

class ActionDispatch::IntegrationTest
  include Capybara

  Capybara.default_host = "subdomain.yourapp.local"
  Capybara.server_port = 3000
  # ... rest of stuff here
end
1 голос
/ 18 января 2011

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

host! "#{store.subdomain}.example.com"
0 голосов
/ 08 октября 2012

Простое и чистое решение - переопределить URL-адреса, которые вы предоставляете для метода посещения Capybara. Он хорошо работает с доменами * .lvh.me, которые перенаправят вас на localhost:

describe "Something" do

  def with_subdomain(link)
    "http://subdomain.lvh.me:3000#{link}"
  end

  it "should do something" do
    visit with_subdomain(some_path)
  end

end

Или вы можете сделать то же самое, переопределив app_host перед спецификацией:

Capybara.app_host = 'http://sudbomain.lvh.me:3000'
..
visit(some_path)
...