前提・実現したいこと
現在doubleを使ったモックの体感を得たいと思い、以下のサイトを参考にし、サンプルを作っています。
【RSpec】doubleで外部API設定をモック化してロジックのテストをする方法
しかし、フォルダ構成やファイルの位置があまり把握できておらず、またRailsでの作成手順も微妙にわからないため、テストが上手く実行できません。
テスト実行をするためのアドバイスを頂きたいです。
ファイルの位置やrequireなどが気がかりです。参考サイトからあまり読み取れず、また参考コードからどのようなファイル構成にすればいいかわかりませんでした。
試したこと
現在以下のようなエラー・フォルダ構成になっています。
https://github.com/k49977/qiita_api
▼lib/qiita_api_client.rb
ruby
1class QiitaApiClient 2 class HTTPError < StandardError 3 def initialize(message) 4 super "connection failed: #{message}" 5 end 6 end 7 8 class << self 9 def connection 10 Faraday::Connection.new('https://qiita.com') do |builder| 11 builder.authorization :Bearer, "#{Rails.application.credentials.qiita[:token]}" 12 builder.request :url_encoded # リクエストパラメータを URL エンコードする 13 builder.response :logger # レスポンスを標準出力する 14 builder.adapter Faraday.default_adapter # アダプターの選択。デフォルトはNet::HTTP 15 builder.response :json, :content_type => "application/json" # レスポンスボディをJSONパースする 16 end 17 end 18 19 def search_item_titles(word) 20 response = connection.get('/api/v2/items') 21 item_titles = response.body.pluck('title') # レスポンスボディのうちtitleプロパティのみを抽出 22 item_titles.select { |title| title.include? "#{word}" } # wordが含まれるtitleのみを返す 23 end 24 end 25end
▼spec/lib/qiita_api_client_spec.rb
ruby
1require 'rails_helper' 2 3describe 'QiitaApiClient' do 4 5 describe '.search_item_titles' do 6 let(:response_body) { [{ "title" => "hoge" }, { "title" => "fuga" }] } 7 before do 8 connection_mock = double('connection_mock') 9 response_mock = double('response_mock', status: 200, body: response_body) 10 allow(connection_mock).to receive(:get).and_return(response_mock) 11 allow(QiitaApiClient).to receive(:connection).and_return(connection_mock) 12 end 13 context '検索がヒットした場合' do 14 it 'データが取得できること' do 15 response = QiitaApiClient.search_item_titles('hoge') 16 expect(response.count).to eq 1 17 end 18 end 19 context '検索がヒットしない場合' do 20 it 'データが取得できないこと' do 21 response = QiitaApiClient.search_item_titles('xxx') 22 expect(response.count).to eq 0 23 end 24 end 25 end 26end
▼Gemfile
source 'https://rubygems.org' git_source(:github) { |repo| "https://github.com/#{repo}.git" } ruby '2.6.5' # Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main' gem 'rails', '~> 6.1.3', '>= 6.1.3.1' # Use sqlite3 as the database for Active Record gem 'sqlite3', '~> 1.4' # Use Puma as the app server gem 'puma', '~> 5.0' # Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder # gem 'jbuilder', '~> 2.7' # Use Redis adapter to run Action Cable in production # gem 'redis', '~> 4.0' # Use Active Model has_secure_password # gem 'bcrypt', '~> 3.1.7' # Use Active Storage variant # gem 'image_processing', '~> 1.2' # Reduces boot times through caching; required in config/boot.rb gem 'bootsnap', '>= 1.4.4', require: false # Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible # gem 'rack-cors' group :development, :test do # Call 'byebug' anywhere in the code to stop execution and get a debugger console gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] gem 'rspec-rails' end group :development do gem 'listen', '~> 3.3' # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring gem 'spring' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby] gem 'faraday'
あなたの回答
tips
プレビュー