質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

0回答

827閲覧

rspecでモックのテストを試すサンプルを作りたい

k499778

総合スコア599

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2021/04/19 16:31

編集2021/04/19 16:35

前提・実現したいこと

現在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'

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問