如何更改用于在rails中testing的默认“www.example.com”域?

我有一个Rails应用程序,根据访问的域名(例如,www.myapp.com将以不同的方式调用user.myapp.com)来执行不同的操作。 在生产使用这一切工作正常,但我的testing代码总是看到一个“www.example.com”的主机名。

有没有一个干净的方式来testing指定它假装访问的主机名?

@request.host = 'user.myapp.com' 

我想所有的答案在这里都是不完整的…列举所有可能的情况:

  • 集成规格 (从ActionDispatch::IntegrationTestinheritance):

     host! "my.awesome.host" 

    请参阅文档第5.1节“ 可用于集成testing的帮助程序”

  • 控制器规格 (从ActionController::TestCaseinheritance)

     @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::TestCaseinheritance)

     @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_HOSTSERVER_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.hosthost! ,并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练习的一部分。