この記事で書いていること
Railsでgrapeを使用してAPIを作成している人に向けて、grapeのヘルパーメソッドのスタブをRspecで作成する方法をまとめています。
よって、grapeについての説明や導入方法などは割愛しています。
環境
Ruby:2.3
Rails:4.2.6
ちょっと古いです。すみません。
ディレクトリ構成
|-app
| |-api
| |-v1
| | |-test.rb
| | |-helper.rb
| | |-root.rb
| |-api.rb
|-spec
|-api
|-v1
|-test_spec.rb
上記以外にもファイルがありますが、必要なもののみ記載しています。
APIの内容
こちらも必要な部分のみ記載しています。
app/api/api.rb
module API
class Root < Grape::API
prefix 'api'
mount V1::Root
end
end
app/api/v1/root.rb
module V1
class Root < Grape::API
version 'v1'
format :json
content_type :json, 'application/json;charset=UTF-8'
helpers Helper
mount V1::Test
end
end
app/api/v1/helper.rb
module V1
module Helper
def success?
# 何かしらの処理(戻り値はtrue or false)
end
end
end
app/api/v1/test.rb
module V1
class Test < Grape::API
resource :test do
# GET /api/v1/test
desc 'テストAPI'
get '/' do
# 何かしらの処理
end
end
end
end
Rspecの内容
spec/api/v1/test_spec.rb
require 'rails_helper'
describe Test, type: :request do
describe 'TestAPI' do
context '実行' do
before do
# ヘルパーメソッドのスタブ作成
Grape::Endpoint.before_each do |endpoint|
allow(endpoint).to receive(:success?).and_return(true)
end
end
after do
# ヘルパーメソッドのスタブ削除
Grape::Endpoint.before_each nil
end
# 以降、APIのテストを記述
end
end
end
beforeでスタブを作成しています。
Grape::Endpoint.before_eachメソッドを使用することでヘルパーメソッドの動作を定義できます。
ここではsuccessメソッドの結果がtrueになるようにしています。
注意しなければならないのは、定義したスタブは以降のdescribeやcontext、exampleに引き継がれるということです。
この例ではsuccessメソッドは以降trueを返すようになるので、テストの内容によっては想定外の結果になる可能性があります。
よってスタブが不要になった時点で削除してあげる必要があります。
削除するにはGrape::Endpoint.before_each nilと定義します。
参考