rspecを使ってコントローラのテストを書く際、ファイルのアップロードを試したいことがあります。
頑張ってActionDispatch::Http::UploadedFile.new()
などとしても、stringに変換されてしまうのでダメですね。
<%= form_for @user do |f| %>
<%= f.text_field :name %>
<%= f.file_field :image %>
<% end %>
上記のようなHTMLを、rspecでシミュレートするには、以下のようにします。
Rails 3.1の環境で試しました。
describe UsersController do
describe “POST users” do
it “should be successful” do
filepath = ‘/home/baba/avatar.jpg’
post ‘create’, {
‘user’ => {
:name => ‘Takao Baba’,
:image => fixture_file_upload(filepath, ‘image/jpg’),
}
}
response.response_code.should == 201
end
end
end
fixture_file_upload
で、第1引数にファイルパス、第2引数にMIMEタイプを入れれば、アクションが受け取れるようにしてくれます。