13

我已将以下代码放入我的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:似乎在通过get,post等发出请求后它会发生变化。在测试中运行以下代码:

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

4 回答 4

17

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

Rails.application.routes.default_url_options[:host]= 'localhost:3000' 
于 2013-10-04T17:43:53.857 回答
7

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
于 2019-01-16T03:24:47.870 回答
0

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

于 2012-10-22T03:09:57.743 回答
0

根据我的经验,url_options如果没有一点黑客攻击,就不会通过测试。

参见例如

在尝试在测试中设置语言环境时,我经常遇到这个问题。不过,我从未使用过动作邮件程序,因此可能有更简单的方法来做到这一点。

我找到的用于设置默认语言环境的解决方案url_options只是修补 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)。在你的情况下,我认为这不应该是一个问题。

不过,猴子补丁并不是一个非常优雅的解决方案,我在其他一切都失败后使用了它。您可能会找到特定于操作邮件程序的更简单的解决方案。

于 2012-10-22T04:15:23.480 回答