我有一个Rails应用程序,根据访问的区域(例如www.myapp.com将以不同方式调用user.myapp.com)采取不同的行为。在生产使用这一切工作正常,但我的测试代码总是看到“www.example.com”的主机名。如何更改用于在rails中测试的默认“www.example.com”域?
是否有一种干净的方式让测试指定它假装访问的主机名?
我有一个Rails应用程序,根据访问的区域(例如www.myapp.com将以不同方式调用user.myapp.com)采取不同的行为。在生产使用这一切工作正常,但我的测试代码总是看到“www.example.com”的主机名。如何更改用于在rails中测试的默认“www.example.com”域?
是否有一种干净的方式让测试指定它假装访问的主机名?
@request.host = 'user.myapp.com'
我相信你可以修改HTTP_HOST
或SERVER_NAME
环境瓦尔更改进入到路由器的要求:
ENV['SERVER_NAME'] = "user.myapp.com"
见raw_host_with_port
在actionpack/lib/action_controller/request.rb。
@request.host = 'user.myapp.com'
是不对的。 应该使用host!('user.myapp.com')
另一件事要记住的是,以确保使用正确的会话实例,这样就可以正确地封装网址助手。
集成测试为您提供了默认会话。您可以直接从你的测试
test "should integrate well" do
https!
get users_path
assert_response :success
end
所有这些助手使用的是默认会话实例,如果不改变调用all session methods,去“www.example.com”。如上所述,主机可以通过主机更改(“my.new.host”)
如果使用open_session方法创建多个会话,则必须始终使用该实例调用辅助方法。这将正确地封装请求。否则轨道会调用它可以使用不同的主机的默认会话实例:如果您打算使用默认的会话对象
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
在功能规格中,主机!已被弃用。这些添加到您的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
我认为,所有的答案都在这里不完整的......要列举所有可能的情况:
集成规格(从ActionDispatch::IntegrationTest
继承):
host! "my.awesome.host"
查看docs,节5.1 可用于集成测试的助手测试。
控制器功能(从ActionController::TestCase
继承)
@request.host = 'my.awesome.host'
参见docs,第4节。4 实例变量可用。
功能规格(通过水豚)
Capybara.default_host = "http://my.awesome.host"
# Or to configure domain for route helpers:
default_url_options[:host] = "my.awesome.host"
查看规格(从ActionView::TestCase
继承)
@request.host = 'my.awesome.host'
...或通过RSpec的:
controller.request.host = "my.awesome.host"
查看rspec-rails
view spec docs。
我尝试了许多变化@request.host
,host!
和post path, args, {'SERVER_NAME' => my_secret_domain}
没有成功,无论是作为控制器测试和功能测试。非常激烈,因为许多其他人报告说这些方法取得了成功。
对我来说,解决办法是:
request.headers["SERVER_NAME"] = my_secret_domain
post path, args
我运行红宝石2.1.5p273,rspec的3.1.7和Rails 4.2.0
另一个答案:
request.host = "user.myapp.com"
我知道它类似于正确的答案,但请裸露在我身上。我不喜欢测试中的赋值操作只是为了设置,我更喜欢明确的存根。有趣的是,磕碰这样不会工作:
allow(request).to receive(:host).and_return("user.myapp.com")
我个人更喜欢磕碰过分配,这样,我得到2好处之一是,它会被RSpec的的验证验证双,二是它明确表示这是一个存根,而不是测试练习的一部分。
在这一点的其他答案建议的方式都没有为我工作。这工作:
Capybara.configure { |config| config.default_host = "my.domain.com" }
'主机! 'user.myapp.com'`为我工作 – deb 2011-08-17 22:32:39
在控制器规范中,当我尝试使用`host!`的时候出现错误。虽然设置`@ request.host`就像答案一样。 – 2012-10-01 12:43:30
我如何在RSpec中使用它?我的意思是,我在哪里配置它?非常感谢! – FRAGA 2012-12-04 18:19:27