Frage

Das ist etwas, das ich verrückt in den letzten paar Tagen wurde die Fahrt. Ich habe eine Aktion, die den authentifizierten Benutzer ermöglicht Vermögenswerte auf die Website hochzuladen. Ich weiß, dass die Controller-Aktion korrekt ist, wie ich manuell durch den Prozess laufen kann jedoch ich es mit rspec testen möchten.

Ich habe den request Helfer verwenden, so dass ich eine authentifizierte Sitzung wiederverwenden kann, die ein :given für diesen Satz von Tests ist.

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

Wenn ich in der spec Breakpoint alles funktioniert gut, aber wenn ich die spec laufen und versuchen, den Weg in die Controller-Aktion durch den Debugger zugreifen ich dieses:

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

Meine Vermutung ist, dass der stub!(:path) nicht für Objekt, was auch immer mock gesetzt zu sein, wird durch den Antrag zu machen.

Die Frage ist: Werde ich über den richtigen Weg für die Prüfung von Dateiuploads und wenn nicht, was ist eine andere Art und Weise

?
War es hilfreich?

Lösung

ich tat es falsch. Durch die Verwendung von request es rief to_s auf alle Paramater, so meine Mock-Objekt als "# [Spec :: Mocks :: Mock: 0x3fda2a4736c0 @name = \" übergeben wurde Datei \ "]". Das wird mir beibringen, mehr Aufmerksamkeit auf Ausnahme Ausgabe zu zahlen.

Stattdessen soll ich multipart_post verwenden und die Authentifizierung Anrufe in einem Block Stub.

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top