Cucumber default_url_options [: host] каждый раз "www.example.com", даже если это указано в environmenttemnts / test.rb - PullRequest
5 голосов
/ 16 июля 2009

Я указал default_url_options в моей среде / test.rb с

config.action_mailer.default_url_options = { :host => "www.xyu.at" }

Это вполне нормально, и в моей истории с огурцами, где я тестирую регистрацию пользователей, ссылка для активации пользователя генерируется правильно

invitation_activation_url(1)
=> "www.xyu.at/signup/1231hj23jh23"

Но когда я пытаюсь перейти по ссылке, указанной в электронном письме, со следующим кодом в functions / steps / user_steps.rb (используя email-rspec от http://github.com/bmabey/email-spec/tree/master):

When /^I follow the invitation link$/ do
  When 'I follow "'+invitation_activation_url(1) + '" in the email'
end

Здесь URL создается с хостом по умолчанию:

invitation_activation_url(1)
=> "www.example.com/signup/1231hj23jh23"

Кто-нибудь может мне помочь? Я не понимаю, что я делаю неправильно ....

Спасибо!

EDIT:

Это похоже на метод

current_url

но я не знаю откуда это ..?

EDIT:

И у меня есть правильная среда, указанная в моих функциях / support / env.rb

ENV["RAILS_ENV"] ||= "test"

EDIT:

Мое временное решение, как сказал Эдбонд,

invitation_activation_url(1, :host => "www.xyz.at")
  => "www.xyz.at/signup/1231hj23jh23"

но я не хочу называть домен явным образом (я указал это уже в моем файле environment / test.rb - таким образом, он не будет сухим)

Ответы [ 5 ]

1 голос
/ 24 марта 2012

Я знаю, сколько лет прошло с тех пор, как это было опубликовано ... но у меня была эта проблема, и у меня ушли часы, чтобы расшифровать ее, пока я не понял ее.

Вы должны использовать вместо

When /^I follow the invitation link$/ do
  When 'I follow "'+invitation_activation_path(1) + '" in the email'
end

_url генерирует путь URL; в то время как _path генерирует путь URI. web_steps.rb использует URI для определения current_url, который он использует для разработки хоста.

от http://api.rubyonrails.org/classes/ActionDispatch/Routing.html

Маршруты могут быть названы путем передачи: как опция, что позволяет легко ссылка на ваш источник как name_of_route_url для полного URL и name_of_route_path для пути URI.

от web_steps.rb

Then /^(?:|I )should be on (.+)$/ do |page_name|                                                                                                                                     |  #     end                                                                                                                                                                           
  current_path = URI.parse(current_url).path                                                                                                                                         |  #                                                                                                                                                                                   
  if current_path.respond_to? :should                                                                                                                                                |  #     collection do                                                                                                                                                                 
    current_path.should == path_to(page_name)                                                                                                                                        |  #       get 'sold'                                                                                                                                                                  
  else                                                                                                                                                                               |  #     end                                                                                                                                                                           
    assert_equal path_to(page_name), current_path                                                                                                                                    |  #   end                                                                                                                                                                             
  end                                                                                                                                                                                |
end 
1 голос
/ 23 июля 2009

Использование: опция хоста в вашем URL.

invitation_activation_url(1, :host => "www.xyz.at")
  => "www.xyz.at/signup/1231hj23jh23"

EDIT:

Вы можете разобрать тело письма и получить ссылку

  mail = YourMailer.deliveries.last
  email_html = Nokogiri::HTML mail.body.to_s
  approve_link = email_html.at_css("a")["href"]
0 голосов
/ 13 августа 2009

Одним из решений (на основе информации здесь ) является определение шага, например

Given /^the domain "(.+?)"$/ do |domain|
  host! domain
end

и используйте его как

Given the domain "www.foo.com"

в функциях.

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

В итоге я использовал очень простой обходной путь в файле env.rb от Cucumber:

# There is a bug in internal_redirect? when used with explicit (non-example.com) domains.
# This is a simple workaround but may break if we start specing external redirects.
# https://webrat.lighthouseapp.com/projects/10503/tickets/140-current_url-should-be-fully-qualified
class Webrat::Session
  alias internal_redirect? redirect?
end

Как уже упоминалось в комментарии, это, конечно, может нарушаться при внешних перенаправлениях, но у нас их нет.

0 голосов
/ 24 июля 2009

Я не очень знаком с огурцом, поэтому не могу с уверенностью сказать, где именно вам придется применить это исправление. Но проблема в том, что default_url_options не установлен в другом месте, где вы пытаетесь сгенерировать ваш URL ...

Поэтому я советую сначала выяснить, в каком контексте генерируется неверный URL. До или после него просто выведите self.class. Это тот класс, который вам придется обезьяна-патч. Например, скажем, «ClassName» было распечатано.

Если у вас это есть, в вашем config / environment / test.rb просто добавьте средство доступа к атрибуту, а затем установите его на то, что вы хотите:

class ClassName
  cattr_accessor :default_url_options
  # or mattr_ if it's a module
end

и затем установите его так же, как ваш actionmailer

ClassName.default_url_options = { :host => "www.xyu.at" }

Весь этот процесс также может быть полезен, когда вы хотите генерировать URL-адреса в моделях или в других эзотерических местах (тогда вам также необходимо включить ActionController :: UrlWriter).

0 голосов
/ 17 июля 2009

Вы говорите, что редактировали config / environment / test.rb. Вы уверены, что ваши функции Cucumber действительно выполняются в «тестовой» среде?

Я недавно добавил Cucumber в проект, над которым работаю, и он, похоже, настроен на использование среды 'cucumber' по умолчанию.

В файле functions / support / env.rb в моем проекте есть это:

ENV["RAILS_ENV"] ||= "cucumber"

Так что, если ваш проект похож, то вам нужно будет также настроить config / environment / cucumber.rb.

...