冴えないタイトルですみません。メモです。
Cucumber + Capybara で RESTful APIをテストする場合は
シナリオ: コメント投稿APIからコメントを投稿できる
もし パラメーター "body" に "こんにちは!" を設定する
かつ "コメント投稿API"を"POST"で送信する
ならば ステータスコードは "201" であること
もし パラメーター "body" に "こんにちは!" を設定する
かつ "コメント投稿API"を"POST"で送信する
ならば ステータスコードは "201" であること
もし /^パラメーター "([^"]*)" に "([^"]*)" を設定する$/ do |param_name, value|
@params ||= {}
@params.merge!({
param_name.to_sym => value
})
end
もし /^"([^"]*)"を"([^"]*)"で送信する$/ do |page_name, http_method|
send(http_method.downcase.to_sym, path_to(page_name), @params)
end
ならば /^ステータスコードは "([^"]*)" であること$/ do |status_code|
response.status.should eq(status_code.to_i)
end
@params ||= {}
@params.merge!({
param_name.to_sym => value
})
end
もし /^"([^"]*)"を"([^"]*)"で送信する$/ do |page_name, http_method|
send(http_method.downcase.to_sym, path_to(page_name), @params)
end
ならば /^ステータスコードは "([^"]*)" であること$/ do |status_code|
response.status.should eq(status_code.to_i)
end
こんな感じでテストを書いています。(「コメント投稿API」はpath.rbで定義しておきます)
さて、本題ですが画像のアップロードでハマりました。
ハマった仮定は省きますが、CapybaraがRack::Testをドライバーとして使っているので、Rack::Test::UploadFile を使ってファイルアップロード周りのコードを簡略化できます。
シナリオ: コメント投稿APIから画像付きのコメントを投稿できる
もし パラメーター "body" に "こんにちは!" を設定する
かつ パラメーター "image" に "sample.png" をファイルとして設定する
かつ "コメント投稿API"を"POST"で送信する
ならば ステータスコードは "201" であること
もし パラメーター "body" に "こんにちは!" を設定する
かつ パラメーター "image" に "sample.png" をファイルとして設定する
かつ "コメント投稿API"を"POST"で送信する
ならば ステータスコードは "201" であること
もし /^パラメーター "([^"]*)" に "([^"]*)" をファイルとして設定する$/ do |param_name, file_path|
file = File.new(File.join(Rails.root, 'features/fixtures/images' file_path))
content_type = MIME::Types.type_for(file.path)[0].to_s
@params ||= {}
@params.merge!({
param_name.to_sym => Rack::Test::UploadedFile.new(file.path, content_type)
})
end
file = File.new(File.join(Rails.root, 'features/fixtures/images' file_path))
content_type = MIME::Types.type_for(file.path)[0].to_s
@params ||= {}
@params.merge!({
param_name.to_sym => Rack::Test::UploadedFile.new(file.path, content_type)
})
end
Rack::Test::UpoadFileの使い方などは、Rack::TestのRSpecを見るとわかりやすかったです。
https://github.com/brynary/rack-test/blob/master/spec/rack/test/multipart_spec.rb