Domanda

Questo è qualcosa che è stato facendo impazzire nel corso degli ultimi giorni. Ho un'azione che consente agli utenti autenticati di caricare asset al sito. So che l'azione del controller è corretto che posso eseguire manualmente attraverso il processo però voglio testarlo utilizzando RSpec.

devo usare l'helper request in modo da poter riutilizzare una sessione autenticata che è un :given per questa serie di test.

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 io breakpoint all'interno della spec tutto funziona bene, ma quando ho eseguito le specifiche e provo ad accedere al percorso nella azione di controllo tramite il debugger ottengo questo:

e file[:tempfile].path
NoMethodError Exception: undefined method `path' for "#[Spec::Mocks::Mock:0x3fda2a4736c0 @name=\"file\"]":String

La mia ipotesi è che il stub!(:path) non viene impostata per qualunque oggetto fittizio sta rendendo attraverso la richiesta.

La domanda è: Sto andando sulla strada giusta per il caricamento di file di test e, se non ciò che è un altro modo

?
È stato utile?

Soluzione

che stavo facendo male. Utilizzando request si stava chiamando to_s su tutti paramaters, quindi il mio oggetto fittizio era stata passata come "# [Spec :: :: Mocks Mock: 0x3fda2a4736c0 @name = \" file \ "]". Questo mi insegnerà a prestare maggiore attenzione alla uscita eccezione.

Invece devo usare multipart_post e spegnere le chiamate di autenticazione in un blocco.

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top