0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

楽天ブックスAPIを用いた書籍検索機能のRequest Spec

Posted at

楽天ブックス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から取得して検索するような処理にしたほうがいいかも?

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?