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

Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top