RSpec路由测试和主机

20

我发现可以像这样使用rspec来测试路由:

get("/").should route_to("welcome#index")

但是我有基于主机名或主机名的部分以及在几个主机之间进行重定向的约束条件。如何在测试时指定主机名?

如何使用适当的配置运行测试? 我尝试打印root_url并且得到了以下信息:

缺少链接的主机! 请提供:host参数,设置default_url_options[:host],或将:only_path设置为true

3个回答

52

每当我运行rspec spec/时,我的机器上都会发生相同的错误。

事实上,整个错误信息是:

Failure/Error: @user = Factory(:user)
     ActionView::Template::Error:
       Missing host to link to! Please provide the :host parameter, set default_url_options[:host], or set :only_path to true
     # ./app/views/devise/mailer/confirmation_instructions.html.erb:5:in `_app_views_devise_mailer_confirmation_instructions_html_erb__980323237__638702928'
     # ./spec/models/campaign_spec.rb:21
以下内容:

以下一行:

# ./app/views/devise/mailer/confirmation_instructions.html.erb:5:in `_app_views_devise_mailer_confirmation_instructions_html_erb__980323237__638702928'
实际上是Devise抛出了错误,这给了我提示。 原来我没有设置。
config.action_mailer.default_url_options = { :host => 'localhost:3000' }

config/environments/test.rb 中添加该配置选项(仅在 development.rb 文件中)。

添加此配置选项可以清除我的错误。 我怀疑您正在使用其他需要相同选项集的 gem。


我没有使用devise,在我的一个邮件视图中,当我尝试使用something_url而不是something_path时,我遇到了相同的错误 - 因为actionmailer不知道它正在运行的环境是什么样子的。你的解决方案有效,但我只是想澄清这不是由devise引起的。 - Oranges13
2
@Oranges13:6个月后,我清楚地看到这不是devise引起的错误,只是它通过了devise的视图。我很高兴我记录了整个调试过程,让我意识到我学到了多少Rails知识。 - Rystraum
1
@Rystraum,我已经使用你的解决方案解决了这个问题。然而,假设你的User模型包括Devise的:confirmable模块,那么在你的:user工厂定义中,以以下方式设置confirmed_at属性可以防止*Missing host...*错误:confirmed_at { Time.now }。尽管如此,在我们的代码涉及生成链接的绝对URL时,设置默认主机是必需的。谢谢。 - Jignesh Gohel
@JiggneshhGohel 谢谢您添加评论,您为我节省了很多时间和压力。当其他方法都无法解决问题时,这个方法解决了我的问题。 - rmcsharry

20

上述方法对我无效。将以下内容添加到spec_helper.rb(在我的情况下是spec/support/mailer.rb,该文件已包含在spec_helper.rb中)可以解决这个错误:

Rails.application.routes.default_url_options[:host] = 'test.host'


这对我有帮助,但我必须将其放在_rails_helper.rb_中。谢谢。 - Sparkmasterflex

8
在我的情况下,我需要添加:
 config.action_mailer.default_url_options = { :host => 'localhost:5000' }

转换为以下内容

config/environments/test.rb

因为我正在使用FactoryGirl来生成一个用户,但是没有跳过用户的email_confirmation。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接