Quantcast
Channel: func09 » ruby on rails
Viewing all articles
Browse latest Browse all 10

Cucumber + Capybara で RESTful API な ファイルアップロード

$
0
0

冴えないタイトルですみません。メモです。

Cucumber + Capybara で RESTful APIをテストする場合は

シナリオ: コメント投稿APIからコメントを投稿できる
  もし  パラメーター "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

こんな感じでテストを書いています。(「コメント投稿API」はpath.rbで定義しておきます)

さて、本題ですが画像のアップロードでハマりました。
ハマった仮定は省きますが、CapybaraがRack::Testをドライバーとして使っているので、Rack::Test::UploadFile を使ってファイルアップロード周りのコードを簡略化できます。

シナリオ: コメント投稿APIから画像付きのコメントを投稿できる
  もし  パラメーター "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

Rack::Test::UpoadFileの使い方などは、Rack::TestのRSpecを見るとわかりやすかったです。
https://github.com/brynary/rack-test/blob/master/spec/rack/test/multipart_spec.rb


Viewing all articles
Browse latest Browse all 10

Trending Articles