現在Rails3.2とRSpec-rails2.12でRSpecのテストを行っているのですが、paramsにどの様にして、オブジェクトをセットすればいいのかわからず、質問させていただきました。
具体的に現在の問題を例に説明させていただきます。
私はJSONファイルをアップロードして、それをもとにBlogモデルを作る。という処理を書いているコントローラ内のメソッドがあります。
このメソッドをテストするために、rspec-railsを使って以下の様なテストを書きました。
describe "POST import_create" do
it "jsonファイルを受信して、それをもとにBlogモデルが作成されていること" do
blog_file = File.new("spec/fixtures/blog.json")
upload = ActionDispatch::Http::UploadedFile.new({
:filename => 'blog.json',
:content_type => 'application/json',
:tempfile => blog_file
})
post :import_create, {:file => upload,:user_id => 1}
………
end
しかしこのテストを実行した結果、コントローラ内でエラーとなりました。
そのコントローラのソースを記述させていただきます。
def import_create
p params[:file] #=>"#<ActionDispatch::Http::UploadedFile:0x007fb14dcbd0a8>"
p params[:file].class #=>"String"
json_array = JSON.parse(params[:file].read.kconv(Kconv::UTF8, Kconv::UTF8)) #=>NoMethodError read
end
ここで私が困っている事を書かせていただきます。
私はテストするためには params[:file]がActionDispatch::Http::UploadedFileクラスのインスタンスを返すことを期待しています。
しかしながら、上記のようにコントローラにわたってきたparams[:file]はStringクラスを返しています。
わたしはRSpecの書き方が悪いためにこの様な事になっていると考えています。
どのようにすればRSpecからparamsにクラスのインスタンスをセットできますか?
ご回答いただけると嬉しいです。