2011-12-01 15 views
11

Duplicar posible:
Is it possible to specify a user agent in a rails integration test or spec?Cómo establecer HTTP_USER_AGENT en las pruebas rspec

Estoy probando una petición en mi rieles aplicación usando rspec. Necesito poder configurar el agente de usuario antes de la solicitud.

Esto no está funcionando:

describe "GET /articles feed for feedburner" do 
it "displays article feed if useragent is feedburner" do 
    # Run the generator again with the --webrat flag if you want to use webrat methods/matchers 
    @articles=[] 
    5.times do 
    @articles << Factory(:article, :status=>1, :created_at=>3.days.ago) 
    end 
    request.env['HTTP_USER_AGENT'] = 'feedburner' 
    get "/news.xml" 
    response.should be_success 
    response.content_type.should eq("application/xml") 
    response.should include("item[title='#{@articles.first.title}']") 
end 

final

¿Cómo puedo especificar correctamente el agente de usuario?

+5

Si va a marcar una pregunta como un duplicado, ¿no sería una buena idea vincular el duplicado? – opsb

Respuesta

8

Intente utilizar esto en su ensayo:

request.stub!(:user_agent).and_return('FeedBurner/1.0') 

o para la nueva RSpec:

allow(request).to receive(:user_agent).and_return("FeedBurner/1.0") 

Reemplazar FeedBurner/1.0 con el agente de usuario que desee utilizar. No sé si ese código exacto funcionará pero something like it should.

+0

No tuve suerte con esto, incluso llamándolo inmediatamente antes de 'publicar', todavía tenía' request.user_agent == nil' en el controlador. ¿Podría publicar un ejemplo más completo? – dukedave

+0

En Rspec reciente, 'request' es nulo. –

3

Esto es lo que hago en una prueba de integración: observe el último hash que establece REMOTE_ADDR (sin HTTP_). Es decir, no es necesario configurar el encabezado HTTP antes de la solicitud, puede hacerlo como parte de la solicitud.

# Rails integration tests don't have access to the request object (so we can't mock it), hence this hack 
it 'correctly updates the last_login_ip attribute' do 
    post login_path, { :email => user.email, :password => user.password }, { 'REMOTE_ADDR' => 'some_address' } 
    user.reload 
    user.last_login_ip.should == 'some_address' 
end 
2

definir este lugar (por ejemplo, spec_helper.rb):

module DefaultUserAgent 

    def post(uri, params = {}, session = {}) 
    super uri, params, {'HTTP_USER_AGENT' => MY_USER_AGENT}.merge(session) 
    end 

    def get(uri, params = {}, session = {}) 
    super uri, params, {'HTTP_USER_AGENT' => MY_USER_AGENT}.merge(session) 
    end 

end 

A continuación, sólo include DefaultUserAgent cuando lo necesite.

Cuestiones relacionadas