ルートで使用される lib クラスの Rails Rspec テストにはプライベート メソッドが含まれています
概要
Simplecov は、lib/api_verson.rb クラスでいくつかのテストが欠落していることを検出しました。
class ApiVersion
def initialize(version)
@version = version
end
def matches?(request)
versioned_accept_header?(request) || version_one?(request)
end
private
def versioned_accept_header?(request)
accept = request.headers['Accept']
accept && accept[/application\/vnd\.#{Rails.application.secrets.my_app_accept_header}-v#{@version}\+json/]
end
def unversioned_accept_header?(request)
accept = request.headers['Accept']
accept.blank? || accept[/application\/vnd\.#{Rails.application.secrets.my_app_accept_header}/].nil?
end
def version_one?(request)
@version == Rails.application.secrets.my_app_default_api_version && unversioned_accept_header?(request)
end
end
このクラスは、API バージョンのセットアップを支援するためにルート ファイルによって使用されます。
namespace :api, path: "", defaults: {format: :json} do
scope module: :v1, constraints: ApiVersion.new(1) do
get '/alive', to: 'api#alive'
end
scope module: :v2, constraints: ApiVersion.new(2) do
get '/alive', to: 'api#alive'
end
end
この設定は versioning_your_ap_is から移植されました。
ここで、simplecov が失敗として報告しているメソッドをテストしようとしています。
require 'spec_helper'
describe ApiVersion do
before(:each) do
@apiversion = ApiVersion.new(1)
@request = ActionController::TestRequest.new(host: 'localhost')
@request.headers["Accept"] = "application/vnd.#{Rails.application.secrets.my_app_accept_header}-#{Rails.application.secrets.my_app_default_api_version}+json"
end
describe 'Method #versioned_accept_header =>' do
it 'Should return the correct accept header version' do
binding.pry
end
end
end
この最初のテストを構築しようとしていますか? @apiversion.send(:unversioned_accept_header, @request) に送信すると、次のエラーが発生します。
@apiversion.send(:unversioned_accept_header, @request)
NoMethodError: undefined method `unversioned_accept_header' for #<ApiVersion:0x007fae009bdad8 @version=1>
from (pry):1:in `block (3 levels) in <top (required)>'
基本的に、「matches?、versioned_accept_header?、unversioned_accept_header?、version_one?」のメソッドにフラグが設定されます。
私は Rspec の専門家ではありません。
ちなみに、これは Rails 4 アプリケーションが実行されています。
group :development, :test do
gem 'pry'
gem 'pry-doc'
gem 'pry-debugger'
gem 'pry-rails'
gem 'pry-plus'
gem 'pry-rescue'
gem 'pry-stack_explorer'
gem 'pry-clipboard'
gem 'pry-nav'
gem 'rspec-rails'
gem 'factory_girl_rails'
gem 'faker'
gem 'seedbank'
gem 'capybara'
end
group :test do
gem 'simplecov', '~> 0.7.1'
gem 'shoulda-matchers'
gem 'spork-rails'
gem 'database_cleaner'
gem 'email_spec'
gem 'timecop'
gem 'json_spec'
end
解決策
このコードを実行すると、
@apiversion.send(:unversioned_accept_header, @request)
しかし、あなたにはメソッドがあります:
def unversioned_accept_header?(request)
accept = request.headers['Accept']
accept.blank? || accept[/application\/vnd\.#{Rails.application.secrets.my_app_accept_header}/].nil?
end
変えてみる
@apiversion.send(:unversioned_accept_header, @request) -> @apiversion.send(:unversioned_accept_header?, @request)
またはメソッド名を変更する
def unversioned_accept_header? -> def unversioned_accept_header