it-swarm-pt.tech

Como faço para configurar um valor de sessão no Capivara?

Estou desenvolvendo um aplicativo para o Shopify e quero fazer um teste de integração.

Preciso ser capaz de armazenar alguns valores na variável de sessão, para que a autenticação funcione.

Como posso fazer isso?

Eu uso Capybara e Capybara-webkit.

28
Nerian

Acabei de encontrar rack_session_access gem e funcionando como um encanto.

22
fguillen

A resposta aceita sugere rack_session_access . Ele funciona inserindo controladores de middleware para editar e atualizar o estado da sessão, então capivara visita essa página e envia um formulário com os dados da sessão. Muito engenhoso! Mas desnecessário se você estiver usando o Warden (diretamente ou por meio do Devise).

Warden tem um gancho on_next_request que dá acesso ao mecanismo do warden, que pode ser usado para definir chaves de sessão diretamente. Eu joguei isso junto para empacotá-lo no rspec:

Crio spec/support/inject_session.rb:

module InjectSession
  include Warden::Test::Helpers

  def inject_session(hash)
    Warden.on_next_request do |proxy|
      hash.each do |key, value|
        proxy.raw_session[key] = value
      end
    end
  end
end

No spec/spec_helper.rb incluir o módulo nas especificações do recurso:

RSpec.configure do |config|
    config.include InjectSession, :type => :feature
end

Então, o uso de amostra em uma especificação pode ser:

   inject_session :magic => 'pixie dust', :color => 'pink' 
   visit shopping_cart_path
   page.should be_all_sparkly_and_pink # or whatever
27
ronen

Receio trazer más notícias, mas da documentação da Capivara:

O acesso à sessão e solicitação não é possível a partir do teste, o acesso à resposta é limitado.

Portanto, você não poderá testar como espera.


Apenas pensando: seria aceitável que você insira alguma instrução condicional em seu controlador para fins de teste:

 session[:foo] = User.first.id if Rails.env.test?

Uma opção melhor seria fazer um monkey patch em seu controlador apenas para seus testes de integração.

4
apneadiving

Conforme recomenda o comentário da apneadiving, você deve preencher o formulário "diretamente" usando capivara. O teste usando o Cucumber pode ser parecido com o preenchimento de um formulário de login para autenticação (da página Capivara github):

When /I sign in/ do
  within("#session") do
    fill_in 'Login', :with => '[email protected]'
    fill_in 'Password', :with => 'password'
  end
  click_link 'Sign in'
  ...
end

Se você está tentando fazer algo diferente ou está tendo problemas com o processo normal de login, esta SO questão pode ajudar.

4
SnapShot

Você pode usar algo como VCR ou webmock para interromper a chamada para o recurso http externo.

4
Brice Stacey