2010-01-19

rspecにファイルアップロードのテストを書く

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
Railsさんアプリでファイルアップロードのテストの書き方です。

以下のようなアップロードしたファイルを/tmpの下に保存するコントローラーがあるとします。
class TestController < ApplicationController
  def index
  end

  def upload
    file=params[:file]['csv']
    @filename = params[:file]['csv'].original_filename
    File.open("/tmp/#{@filename}","wb"){ |f| f.write(file.read) }
  end
end
このコントローラー用のviewを以下のような感じで用意します。
<% form_tag({:action => 'upload'},{:class=>'form',:multipart=>true}) do %>
<%= file_field "file","csv" %>
<%= submit_tag("upload") %>
<% end %>
specファイルは以下のような感じになります。
describe TestController do
  describe "fileをポストする" do
    before(:each) do
      @file = fixture_file_upload "test.csv", "text/comma-separated-values"
      post 'upload',:file => {"csv"=>@file}
    end
    after(:each) do
      File.delete("/tmp/test.csv")
    end
    it "/tmpにファイルが保存される" do
      FileTest.exist?("/tmp/test.csv").should be_true
    end
  end
end
ファイルアップロードのテストにはfixture_file_uploadを使うようです。
fixture_file_uploadで指定するファイルは
spec/fixtures/
にあると見なされるようです。
viewで
file_field "file","csv"
とした部分は
post 'upload',:file => {"csv"=>@file}
と指定すればよいようです。
コメントを投稿