2009-03-01 93 views

回答

23
@request.host = 'user.myapp.com' 
+17

'主机! 'user.myapp.com'`为我工作 – deb 2011-08-17 22:32:39

+2

在控制器规范中,当我尝试使用`host!`的时候出现错误。虽然设置`@ request.host`就像答案一样。 – 2012-10-01 12:43:30

+6

我如何在RSpec中使用它?我的意思是,我在哪里配置它?非常感谢! – FRAGA 2012-12-04 18:19:27

1

@request.host = 'user.myapp.com'是不对的。 应该使用host!('user.myapp.com')

2

另一件事要记住的是,以确保使用正确的会话实例,这样就可以正确地封装网址助手。

集成测试为您提供了默认会话。您可以直接从你的测试

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 
9

在功能规格中,主机!已被弃用。这些添加到您的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 
53

我认为,所有的答案都在这里不完整的......要列举所有可能的情况:

  • 集成规格(从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" 
    

    @AminAriana's answer

  • 查看规格(从ActionView::TestCase继承)

    @request.host = 'my.awesome.host' 
    

    ...或通过RSpec的:

    controller.request.host = "my.awesome.host" 
    

    查看rspec-railsview spec docs

1

我尝试了许多变化@request.hosthost!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

0

另一个答案:

request.host = "user.myapp.com" 

我知道它类似于正确的答案,但请裸露在我身上。我不喜欢测试中的赋值操作只是为了设置,我更喜欢明确的存根。有趣的是,磕碰这样不会工作:

allow(request).to receive(:host).and_return("user.myapp.com") 

我个人更喜欢磕碰过分配,这样,我得到2好处之一是,它会被RSpec的的验证验证双,二是它明确表示这是一个存根,而不是测试练习的一部分。

0

在这一点的其他答案建议的方式都没有为我工作。这工作:

Capybara.configure { |config| config.default_host = "my.domain.com" } 
相关问题