2009-03-01 92 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" } 
相關問題