如何更改用于在rails中testing的默认“www.example.com”域?
我有一个Rails应用程序,根据访问的域名(例如,www.myapp.com将以不同的方式调用user.myapp.com)来执行不同的操作。 在生产使用这一切工作正常,但我的testing代码总是看到一个“www.example.com”的主机名。
有没有一个干净的方式来testing指定它假装访问的主机名?
@request.host = 'user.myapp.com'
我想所有的答案在这里都是不完整的…列举所有可能的情况:
-
集成规格 (从
ActionDispatch::IntegrationTest
inheritance):host! "my.awesome.host"
请参阅文档第5.1节“ 可用于集成testing的帮助程序” 。
-
控制器规格 (从
ActionController::TestCase
inheritance)@request.host = 'my.awesome.host'
请参阅文档第4.4节“ 可用的实例variables” 。
-
function规格 (通过水豚)
Capybara.default_host = "http://my.awesome.host" # Or to configure domain for route helpers: default_url_options[:host] = "my.awesome.host"
来自@AminAriana的回答
-
查看规格 (从
ActionView::TestCase
inheritance)@request.host = 'my.awesome.host'
…或通过RSpec:
controller.request.host = "my.awesome.host"
请参阅
rspec-rails
视图规范文档 。
在function规格,主机! 已被弃用。 将这些添加到你的rspec_helper.rb:
# Configure Capybara expected host Capybara.app_host = <myhost> # Configure actual routes host during test before(:each) do default_url_options[:host] = <myhost> end
我相信你可以修改HTTP_HOST
或SERVER_NAME
环境variables来改变请求到路由器:
ENV['SERVER_NAME'] = "user.myapp.com"
请参阅actionpack / lib / action_controller / request.rb中的raw_host_with_port 。
另外要记住的是确保使用正确的会话实例,以便您可以正确地封装url助手。
集成testing为您提供了一个默认会话。 您可以直接从您的testing中调用所有会话方法
test "should integrate well" do https! get users_path assert_response :success end
所有这些助手都使用默认会话实例,如果没有更改,则转到“www.example.com”。 正如已经提到的,主机可以通过主机来改变!(“my.new.host”)
如果使用open_session方法创build多个会话,则必须始终使用该实例调用辅助方法。 这将正确地封装请求。 否则,rails会调用可能使用不同主机的默认会话实例:
test "should integrate well" do sess = open_session sess.host! "my.awesome.host" sess.get users_url #=> WRONG! will use default session object to build url. sess.get sess.users_url #=> Correctly invoking url writer from my custom session with new host. sess.assert_response :success end
如果您打算使用默认会话对象,那么您也必须更改该主机:
test "should integrate well" do sess = open_session sess.host! "my.awesome.host" host! sess.host #=> Set default session host to my custom session host. sess.get users_url end
@request.host = 'user.myapp.com'
是不正确的。 应该使用host!('user.myapp.com')
我尝试了许多变种@request.host
, host!
,并post path, args, {'SERVER_NAME' => my_secret_domain}
,但都没有成功,都是作为控制器testing和functiontesting。 非常激烈,许多人报告说这些方法取得了成功。
我的解决scheme是:
request.headers["SERVER_NAME"] = my_secret_domain post path, args
我正在运行ruby 2.1.5p273,rspec 3.1.7和Rails 4.2.0
还有一个答案:
request.host = "user.myapp.com"
我知道它类似于正确的答案,但请裸露在我身上。 我不喜欢testing中的赋值操作只是为了设置,我更喜欢明确的存根。 有趣的是,像这样的桩是行不通的:
allow(request).to receive(:host).and_return("user.myapp.com")
我个人比较喜欢剔除任务,这样我就可以得到两个好处,一个是通过rspec的validation双validation ,二是明确地说是存根,而不是testing练习的一部分。