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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

Q&A

解決済

1回答

3271閲覧

RSpecでのsubjectの使い方

mika2002

総合スコア20

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

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

0グッド

0クリップ

投稿2020/05/09 11:16

編集2020/05/10 12:58

以下のようなテストがあり、beforeが二つのcontextの下に重複している形なのですが、この状態ではDRYではないと思い、検索したのですが正解にたどり着きませんでした。
subjectでbeforeの部分をDRYにしたいです。

ruby

1 headers = { 2 'Authorization': "Bearer invalid", 3 }

こちらのheaderの部分だけ違った情報をいれており、全く同じbeforeの中身にはなっていません、、

ただ、検索していてもsubjectをそのように活用する例を見つける事ができません。
アドバイス頂けると嬉しいです、、

そもそもそういった場合にsubjectをつかうべきではなく、他の方法があれば、それについても教えて頂けると幸いです。

ruby

1require 'rails_helper' 2 3RSpec.describe "API", type: :request do 4 let!(:correct_key) { Rails.application.credentials.api[:CORRECT_KEY] } 5 6 describe "GET /api" do 7 context 'access ok' do 8 before do 9 headers = { 10 'Authorization': "Bearer #{correct_key}", 11 } 12 get '/api', headers: headers 13 end 14 15 it "request success" do 16 expect(response.status).to eq 200 17 end 18 19 end 20 end 21 22 context 'access fail' do 23 before do 24 headers = { 25 'Authorization': "Bearer invalid", 26 } 27 get '/api', headers: headers 28 end 29 30 it "request fail" do 31 expect(response.status).to eq 401 32 end 33 end 34 end 35end

よろしくお願い致します。
質問にわかりずらいところがあれば、ご指摘下さい!!

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

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

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

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

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

guest

回答1

0

ベストアンサー

letではないでしょうか?

https://qiita.com/jnchito/items/42193d066bd61c740612#let-%E3%81%AE%E3%83%A1%E3%83%AA%E3%83%83%E3%83%88%E3%82%92%E6%B4%BB%E3%81%8B%E3%81%97%E3%81%A6-age-%E3%82%82-let-%E3%81%A7%E7%BD%AE%E3%81%8D%E6%8F%9B%E3%81%88%E3%82%8B

手元にRailsの環境が無いので検証できませんが、大体以下のようになるかと思います

ruby

1 # headersをletにする 2 # access ok と共通 3 let(:headers) { 4 {'Authorization': "Bearer #{bearer_key}",} 5 } 6 context 'access fail' do 7 # bearer_keyはinvalid 8 let(:bearer_key) {'invalid'} 9 before do 10 get '/api', headers: headers 11 end 12 it "request fail" do 13 expect(response.status).to eq 401 14 end 15 end

投稿2020/05/10 17:50

maai

総合スコア463

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

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

mika2002

2020/05/11 05:45

ありがとうございます! 本当ですね、同じ様に、headersもletにすることができますね。 一点だけ追加で質問させて下さい、、 頂いた記事も最初の質問の前に確認していて、 https://qiita.com/jnchito/items/42193d066bd61c740612#subject-%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%86%E3%82%B9%E3%83%88%E5%AF%BE%E8%B1%A1%E3%81%AE%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%921%E7%AE%87%E6%89%80%E3%81%AB%E3%81%BE%E3%81%A8%E3%82%81%E3%82%8B こちらに、 > subject { user.greet } という書き方が載っていたのですが、 自分の場合は、テストしている内容の、 >response.status をリクエストしている、 >get '/api', headers: headers この部分をsubjectにできるのではないか、と思いました。 こういった場合に、どのようにsubjectにすればいいのか、ご存知でしょうか、、
maai

2020/05/11 16:11

> この部分をsubjectにできるのではないか、と思いました。 subjectってexpect(foobar)を置き換えるもの、だと思っていたので、 ``` subject do response.status # ! end context 'access fail' do let(:bearer_key) {'invalid'} before do get '/api', headers: headers end it "request fail" do is_expected.to eq 401 # ! end end ``` にしかならないのでは、と思っていたのですが、調べてみると https://qiita.com/takutotacos/items/f65b47d18c124110eebd 以下のような書き方をしている記事もありました。 ``` subject do get '/api', headers: headers # before にあったものをsubjectに移動 response.status # ! end context 'access fail' do let(:bearer_key) {'invalid'} it "request fail" do is_expected.to eq 401 # ! end end ``` なので、get '/api', headers: headers を subject に移動できますが、 expectedのついでにgetも移動できる、というイメージでしょうか
mika2002

2020/05/12 01:09

本当にありがとうございます! 教えて頂いた方法で、無事テストを通す事ができました!! 自分では見つけることができませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問