現在以下を参考にRails APIを作成し、Rspecでテストをしようとしています。
Railsで超簡単API
【Rails】APIテストの書き方
APIを作り終えて、Rspecの環境構築をし、テストを実装したので、bundle exec rspec
でテスト実行すると以下のようなエラーが出ました。
F Failures: 1) PostAPI 全てのポストを取得する Failure/Error: raise WrongScopeError, "`#{name}` is not available from within an example (e.g. an " \ "`it` block) or from constructs that run in the scope of an " \ "example (e.g. `before`, `let`, etc). It is only available " \ "on an example group (e.g. a `describe` or `context` block)." `name` is not available from within an example (e.g. an `it` block) or from constructs that run in the scope of an example (e.g. `before`, `let`, etc). It is only available on an example group (e.g. a `describe` or `context` block). (省略) Finished in 0.00662 seconds (files took 2.44 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/request/api/v1/posts_spec.rb:5 # PostAPI 全てのポストを取得する
これを解決するにはどうしたらいいでしょうか?
調べているのですが、なかなか解決できずにいます。
設定周りなのか、コードなのか、プロダクトコードが認識できていないのか、なにかライブラリが読み込めていないのか、、、いろんな予想を立てて調べています。
もしアドバイスいただける方がいらっしゃいましたらお願いいたします。
以下のようなコードです。
↓posts_spec.rb
rb
1require 'rails_helper' 2# [Rails API Testing Best Practices] (https://matthewlehner.net/rails-api-testing-guidelines) 3 4describe 'PostAPI' do 5 it '全てのポストを取得する' do 6 post = create(:post, title: 'test-title') 7 8 get "/api/v1/posts/#{post.id}" 9 json = JSON.parse(response.body) 10 11 # リクエスト成功を表す200が返ってきたか確認する。 12 expect(response.status).to eq(200) 13 14 # 要求した特定のポストのみ取得した事を確認する 15 expect(json['data']['title']).to eq(post.title) 16 end 17end
PostmanでAPIのCRUDは実施確認済みです。(プロダクトコードは参考サイトと同様です。)
Gemfileは以下です。(「★追加」とコメントしているところがテストコード実装時に追加したものです。)
gemfile
1source 'https://rubygems.org' 2git_source(:github) { |repo| "https://github.com/#{repo}.git" } 3 4ruby '2.7.1' 5 6# Bundle edge Rails instead: gem 'rails', github: 'rails/rails', branch: 'main' 7gem 'rails', '~> 6.1.2', '>= 6.1.2.1' 8# Use sqlite3 as the database for Active Record 9gem 'sqlite3', '~> 1.4' 10# Use Puma as the app server 11gem 'puma', '~> 5.0' 12# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder 13# gem 'jbuilder', '~> 2.7' 14# Use Redis adapter to run Action Cable in production 15# gem 'redis', '~> 4.0' 16# Use Active Model has_secure_password 17# gem 'bcrypt', '~> 3.1.7' 18 19# Use Active Storage variant 20# gem 'image_processing', '~> 1.2' 21 22# Reduces boot times through caching; required in config/boot.rb 23gem 'bootsnap', '>= 1.4.4', require: false 24 25# Use Rack CORS for handling Cross-Origin Resource Sharing (CORS), making cross-origin AJAX possible 26# gem 'rack-cors' 27 28group :development, :test do 29 # Call 'byebug' anywhere in the code to stop execution and get a debugger console 30 gem 'byebug', platforms: [:mri, :mingw, :x64_mingw] 31 gem 'factory_bot_rails' #★追加 32 gem 'rspec-rails', '~> 3.9.1' #★追加 33end 34 35group :development do 36 gem 'listen', '~> 3.3' 37 # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring 38 gem 'spring' 39end 40 41# Windows does not include zoneinfo files, so bundle the tzinfo-data gem 42gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
追記
試したこと
・「rspec "#{name}
is not available from within an example」で検索
結果、以下のサイトを確認しましたがピンとこず解決に至っていません。
https://stackoverflow.com/questions/45439673/rspec-mocking-name-not-available-from-within-an-example-group
https://qiita.com/opiyo_taku/items/6364adf27102d30f0e6d
・変数のスコープ絡みなのかな。といった観点でも調査。
・テストコードを中身がない状態や必ずtrueとなる状態にして実施→同じエラーが出る
rb
1require 'rails_helper' 2 3describe 'PostAPI' do 4 it '全てのポストを取得する' do 5 expect(1).to eq(1) #これを消しても同じエラー 6 end 7end
追記2
▼こちらに現在うまくRspecが起動できないプロジェクトを置きました。(blogプロジェクト)
https://github.com/k49977/railsAPI/tree/master/blog
「rails s」でサーバー起動し、
exec rspec spec/request/api/v1/posts_spec.rb
でテストを実行すると現状のエラーになります。
回答1件
あなたの回答
tips
プレビュー