2009-03-01 11 views

risposta

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

'host! 'user.myapp.com'' ha funzionato per me – deb

+2

In una specifica del controller, ottengo un errore quando provo a usare 'host!'. Impostazione '@ request.host' come se la risposta suggerisse funzionasse. –

+6

E come lo uso con RSpec? Voglio dire, dove lo configuro? grazie molto! – FRAGA

4

io credo che si possa modificare l'ambiente HTTP_HOST o SERVER_NAME VAR di modificare la richiesta che va al router:

ENV['SERVER_NAME'] = "user.myapp.com" 

Vedi raw_host_with_port in actionpack/lib/action_controller/request.rb.

1

@request.host = 'user.myapp.com' non è giusto. dovrebbe usare host!('user.myapp.com')

+2

Questa sintassi non ha funzionato per me. Nemmeno la risposta accettata. L'unica cosa che ha funzionato come host! ('Newhostname.com'). – jeffarena

+1

Ovviamente è necessario inserire la stringa del nome host in virgolette singole o doppie. – justingordon

2

Un'altra cosa da ricordare è quello di assicurarsi di utilizzare l'istanza corretta sessione modo che si può incapsulare correttamente gli aiutanti url.

I test di integrazione forniscono una sessione predefinita. È possibile chiamare all session methods direttamente dai test

test "should integrate well" do 
    https! 
    get users_path 
    assert_response :success 
end 

Tutti questi aiutanti si utilizza l'istanza predefinita della sessione, che, se non modificata, va a "www.example.com". Come è stato detto l'host può essere cambiato facendo host! ("My.new.host")

Se si creano più sessioni utilizzando il metodo open_session, è necessario SEMPRE utilizzare tale istanza per chiamare i metodi di supporto. Questo incapsulerà correttamente la richiesta. In caso contrario, le rotaie chiameranno l'istanza sessione predefinita che può utilizzare un host diverso:

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 

Se si intende utilizzare l'oggetto sessione predefinita, allora dovrete modificare tale ospite così:

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

Nelle specifiche delle funzioni, host! è stato deprecato. Aggiungere questi al vostro 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 
+0

Nota: Sembra che 'Capybara.app_host' deve includere il protocollo. Per esempio. '" http: //test.domain "' piuttosto che solo '" test.domain "'. – lime

+1

come includere la porta? –

53

Credo che tutte le risposte sono incomplete qui ... Per enumerare tutti i casi possibili:

  • integrazione Spec (che eredita da ActionDispatch::IntegrationTest):

    Vedere il docs, sezione 5.1 Helpers disponibili per i test di integrazione.

  • controller Spec (che eredita da ActionController::TestCase)

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

    Vedere il docs, sezione 4.4 Variabili di istanza disponibili.

  • Spec Feature (attraverso Capybara)

    Capybara.default_host = "http://my.awesome.host" 
    # Or to configure domain for route helpers: 
    default_url_options[:host] = "my.awesome.host" 
    

    Da @AminAriana's answer

  • Vista Spec (che eredita da ActionView::TestCase)

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

    ... o tramite RSpec:

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

    Vedi l'rspec-railsview spec docs.

+0

Grazie alle rotaie 5 e passando da 'ActionController :: TestCase' a' ActionDispatch :: IntegrationTest' questa importante 'Integration Specs' è inestimabile per quelli di noi con applicazioni multi-tennant legacy.Questa è stata la prima risposta che ha mostrato come ottenere '@ request.host' facilmente convertito in una suite precedente (usando' host! '). Leggendo i documenti questo non mi è saltato addosso ma eccoci qui, e grazie! – pjammer

1

ho provato molte variazioni di @request.host, host! e post path, args, {'SERVER_NAME' => my_secret_domain} senza successo, sia come test controller e prove di funzionalità. Molto aggravante, come molti altri hanno riportato il successo con questi approcci.

La soluzione per me è stato:

request.headers["SERVER_NAME"] = my_secret_domain 
post path, args 

Io corro rubino 2.1.5p273, RSpec 3.1.7 e Rails 4.2.0

0

Ancora un'altra risposta:

request.host = "user.myapp.com" 

So che assomiglia alla risposta corretta, ma per favore nuda con me. Non mi piace l'operazione di assegnazione in prova solo per impostare le cose, preferisco uno stub esplicito. È interessante notare che, spegnendo come questo non sarà lavoro:

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

Io personalmente preferisco spegnendo nel corso di assegnazione, in questo modo ottengo 2 beneficio, uno è che sarà convalidata da RSpec di verificare doppio, seconda è che sta dicendo esplicitamente che è un mozzicone, non parte dell'esercitazione di prova.

0

Nessuno dei modi suggeriti in altre risposte al punto ha funzionato per me. Questo ha funzionato:

Capybara.configure { |config| config.default_host = "my.domain.com" }