Testando o upload de arquivos autenticados em merb
-
12-09-2019 - |
Pergunta
Isso é algo que foi me deixando louco ao longo dos últimos dias. Eu tenho uma ação que permite que os usuários autenticados para carregar ativos para o site. Eu sei que a ação do controlador está correto como eu pode executar através do processo manualmente no entanto eu quero testá-lo usando rspec.
Eu tenho que usar o ajudante request
para que eu possa reutilizar uma sessão autenticada que é um :given
para este conjunto de testes.
it "should allow authenticated file uploads" do
file = File.open(a_valid_file)
mock_file = mock("file")
mock_file.stub!(:path).and_return(file.path)
request( resource(:assets), :method => "POST",
:params => { :file =>
{:tempfile => mock_file, :filename => File.basename(file.path)} }
)
end
Se eu ponto de interrupção dentro da especificação tudo funciona muito bem, no entanto, quando eu corro a especificação e tente acessar o caminho na ação do controlador através do depurador fico com esta:
e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String
O meu palpite é que o stub!(:path)
não está sendo definido por qualquer objeto fictício é torná-lo através do pedido.
A questão é:? Am I vai sobre o caminho certo para testar o upload de arquivos e se não o que é uma outra maneira
Solução
Eu estava fazendo errado. Usando request
ele estava chamando to_s em todos os paramaters, então meu objeto fictício estava sendo passado como "# [Spec :: Mocks :: Mock: 0x3fda2a4736c0 @name = \" file \ "]". Isso vai me ensinar a prestar mais atenção à saída de exceção.
Em vez disso, deve usar multipart_post
e toco as chamadas de autenticação em um bloco.
it "should allow authenticated file uploads" do
file = File.open(a_valid_file)
multipart_post( resource(:assets), :method => "POST",
:params => { :file => file } ) do |controller|
controller.stub!(:ensure_authenticated).and_return(true)
controller.session.stub!(:user).and_return(User.first)
)
end