2009-08-07 8 views
0

Das ist etwas, das mich in den letzten Tagen verrückt gemacht hat. Ich habe eine Aktion, mit der authentifizierte Benutzer Assets auf die Site hochladen können. Ich weiß, dass die Controller-Aktion korrekt ist, da ich den Prozess manuell durchlaufen kann, aber ich möchte es mit rspec testen.Testen von authentifizierten Datei-Uploads in merb

Ich muss den request Helfer verwenden, damit ich eine authentifizierte Sitzung wiederverwenden kann, die eine :given für diese Reihe 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 innerhalb der Spezifikation Stopp-es ​​alle schön aber funktioniert, wenn ich die spec laufen und versuchen, den Weg in die Controller-Aktion durch den Debugger das ich für den Zugriff auf:

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

Meine Vermutung ist, dass die stub!(:path) nicht für das festgelegt wird, was auch immer Mock-Objekt durch die Anfrage macht.

Die Frage ist: Gehe ich den richtigen Weg für das Testen von Datei-Uploads und wenn nicht, was ist ein anderer Weg?

Antwort

0

Ich habe es falsch gemacht. Durch Verwendung von request wurde to_s auf allen Parametern aufgerufen, so dass mein Mock-Objekt als "# [Spec :: Mocks :: Mock: 0x3fda2a4736c0 @name = \" file \ "] übergeben wurde. Das wird mich lehren, mehr Aufmerksamkeit auf Ausnahmen zu lenken.

Stattdessen sollte ich multipart_post verwenden und die Authentifizierungsaufrufe in einem Block ausgeben.

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