在测试环境中设置default_url_options似乎不起作用

时间:2012-10-22 03:06:31

标签: ruby-on-rails-3 testing rspec

我已将以下代码放入config/environments/test.rb文件中:

config.action_mailer.default_url_options = { :host => "localhost:3000" }

然而,当我运行测试时,所有路由都使用http://test.host。我正在尝试使用不接受http://test.host作为有效回调URI的API,因此我需要对其进行更改以正确接收API响应。知道为什么这不起作用吗? (我在我的测试套件中使用RSpec,Guard和Spork)。

编辑:可能相关 - 这是在控制器规范内完成的。

EDIT2 :通过getpost等请求后,它似乎发生了变化。在测试中运行以下代码:

Rails.logger.debug users_url
get 'http://google.com'
Rails.logger.debug users_url

将产生以下输出:

http://localhost:3000/users
...get request related response here
http://google.com/users

4 个答案:

答案 0 :(得分:12)

现在你可以像test.rb那样设置它们:

Rails.application.routes.default_url_options[:host]= 'localhost:3000' 

答案 1 :(得分:2)

Rails.application.routes.default_url_options[:host]= 'localhost:3000'

在developemnt.rb / test.rb中,可以更加简洁如下:

Rails.application.configure do
  # ... other config ...

  routes.default_url_options[:host] = 'localhost:3000'
end

答案 2 :(得分:0)

你是如何运行测试的?也许附加RAILS_ENV=test可能有所帮助。

答案 3 :(得分:0)

根据我的经验,url_options不会在没有任何黑客攻击的情况下进入测试阶段。

参见例如

尝试在测试中设置语言环境时,我经常遇到此问题。但是,我从未使用过动作邮件,所以可能有一种更简单的方法。

我在url_options中设置默认语言环境的解决方案只是patch actiondispatch并强制它使用我想要的任何语言环境。您可以通过这种方式适应您的情况:

class ActionDispatch::Routing::RouteSet
  def url_for_with_default_url_options(options)
    url_for_without_default_url_options(options.merge(:host => "localhost:3000" ))
  end

  alias_method_chain :url_for, :default_url_options
end

我将该代码放在spec / support的文件中,因此它在rspec测试中使用,我也需要从我的env.rb文件中使用它,所以我也可以在黄瓜测试中使用它。

请记住,这会在测试代码和测试中运行的实际代码中对无处不在进行修补,并且它将覆盖您尝试的:host密钥的任何其他设置传入(因为补丁合并了传递到url_for的选项顶部的修复)。在你的情况下,我认为这应该不是问题。

但是,猴子补丁不是一个非常优雅的解决方案,而且在其他一切都失败之后我就用它了。您可能会找到一个特定于动作邮件的简单解决方案。