楽天ブックスAPIを用いたアプリを作成するにあたり書籍検索機能でリクエストスペックを書きたくなった。
調べてもあまり出てこなかったので手探りで実装してみました。
①楽天ブックスAPIの導入
下記サイトが非常に参考になりました。
https://www.for-engineer.life/entry/rails-rakuten-book-api/
ほぼほぼここに書いてあるとおりなので詳細な説明は割愛します。
②テストファイルの生成
rails g rspec:request books
こちらのコマンドでリクエストスペックファイルを生成
③ダミーデータの作成
require 'rails_helper'
RSpec.describe "Books", type: :request do
let(:book_search_params) { {keyword: '7つの習慣'} }
end
ダミーデータをテスト上で作ります。パラメータとして送信するので名前はbook_search_paramsとしました。
④searchアクションでパラメータを受け取れるようにする
def search
return nil if params[:keyword] == ""
@books = RakutenWebService::Books::Book.search(title: params[:keyword])
render json: { books: @books }
記事では検索クエリが固定値だったので任意のパラメータで検索できるようにします。
ここでの疑問としては複数のパラメータで同時に検索できないか?ということなのですが果たしてできるのでしょうか…
パラメータで空文字列が飛んできた時はreturn nilとして処理を止めます。
フロントエンドから検索を実装したときに何も入力してなくても空文字列が送られてくると思ったからです。
⑤実際にテストコードを書く
RSpec.describe "Books", type: :request do
let(:book_search_params) { {keyword: '7つの習慣'} }
describe "書籍の検索" do
context "検索に成功" do
it "パラメータが存在すればリクエストに成功する" do
get search_api_v1_books_path, xhr: true, params: book_search_params
expect(response).to have_http_status(200)
end
it "レスポンスがJSON形式で返却される" do
get search_api_v1_books_path, xhr: true, params: book_search_params
json = JSON.parse(response.body)
expect(json['books']).not_to eq nil
end
end
context "検索に失敗" do
it "パラメータが空文字列の時ステータス204が返却される" do
get search_api_v1_books_path, xhr: true, params: {keyword: ""}
expect(response).to have_http_status(204)
end
it "パラメータが空文字列の時レスポンスは空文字列である" do
get search_api_v1_books_path, xhr: true, params: {keyword: ""}
expect(response.body).to eq ""
end
end
end
end
正常形、異常形それぞれでステータスとレスポンスの中身をチェックした。
これで実際にAPIと連携してテストが通った。
気になるところ
上にも書いたけど検索クエリって一つのパラメータでしか検索できないのかな?
だとするとキーと値を同時にparamsから取得して検索するような処理にしたほうがいいかも?